{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "9yIvMgBci4cm"
   },
   "source": [
    "各种库学习"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "duq3RdSzi4cp"
   },
   "source": [
    "# 环境"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Xp4-ZZMbi4cq"
   },
   "source": [
    "## 环境包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "n9PmFgTDi4cr"
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import json\n",
    "from lime import lime_image\n",
    "import time\n",
    "import h5py\n",
    "import argparse\n",
    "import shutil\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from PIL import Image\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "AyE8C6_JoWlq"
   },
   "source": [
    "## jupyter notebook特殊命令"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "gDwP8wSvoWlq"
   },
   "source": [
    "显示Jupyter当前的工作空间"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 924,
     "status": "ok",
     "timestamp": 1578478253762,
     "user": {
      "displayName": "宏沉一笑",
      "photoUrl": "",
      "userId": "12018462559157601606"
     },
     "user_tz": -480
    },
    "id": "wWRQbYb_oWls",
    "outputId": "b9fa1d83-8c4e-406f-9ecf-50ccff149285"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'G:\\\\Git\\\\Pytorch_ModelAI'"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%pwd"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "pP0BiamYoWlv"
   },
   "source": [
    "显示当前Jupyter中，所有运行过的历史代码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "7hLLlP1hoWlw",
    "outputId": "b37c62bc-907d-486e-ae27-eeec371cbd8b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "import os\n",
      "import time\n",
      "import h5py\n",
      "%pwd\n",
      "#显示Jupyter当前的工作空间。\n",
      "%pwd\n",
      "%pwd\n",
      "%list\n",
      "%hist\n"
     ]
    }
   ],
   "source": [
    "%hist"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "wxszEKH3oWly"
   },
   "source": [
    "显示当前Jupyter环境中的所有变量或名称"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "FENXXE5CoWlz",
    "outputId": "68faa614-3400-445a-9559-fea7e8a855e8"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Interactive namespace is empty.\n"
     ]
    }
   ],
   "source": [
    "%who"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "BUXSSoDCoWl2"
   },
   "source": [
    "用于删除当前Jupyter环境中的所有变量或名称"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "cZgdF_SFoWl2",
    "outputId": "bc60bc50-f823-47e6-99a2-404238ff3798"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Once deleted, variables cannot be recovered. Proceed (y/[n])? y\n"
     ]
    }
   ],
   "source": [
    "%reset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "RRFMt51VoWl5"
   },
   "source": [
    "计算当前代码行的运行时长"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "bj2LS52IoWl6",
    "outputId": "7a8ecdca-8953-44ca-c1e3-049c50103737"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 0 ns\n"
     ]
    }
   ],
   "source": [
    "time.sleep(10)\n",
    "%time"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "HafaHB2coWl9"
   },
   "source": [
    "计算当前代码行的平均运行时长（即在执行一个语句100000次(默认情况下)后，再给出运行最快3次的平均值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "fqMlPIDroWl-"
   },
   "outputs": [],
   "source": [
    "%timeit"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "sRfZyTc2oWmA"
   },
   "source": [
    "计算当前cell的代码运行时长"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "DvM8DZuvoWmB",
    "outputId": "b90d546e-75b5-451d-8b2c-e7b23a35ae97"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "UsageError: Line magic function `%%timeit` not found.\n"
     ]
    }
   ],
   "source": [
    "time.sleep(1)\n",
    "%%timeit"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "WGbMa7vuoWmD"
   },
   "source": [
    "显示绘图结果的风格，默认为%matplotlib inline，是直接将图片显示在浏览器中，如果希望图片单独生成，可以使用%matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "GntUNmcAoWmH",
    "outputId": "acf98bd5-3995-4aa7-c1d7-87e1da4598e8"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using matplotlib backend: Qt5Agg\n"
     ]
    }
   ],
   "source": [
    "%matplotlib"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "-TBlyHlPoWmK"
   },
   "source": [
    "加载本地Python文件或者网络中的Python文件，例如本地脚本文件的加载：%load xxx.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "NjhvASM8oWmL",
    "outputId": "dcd0e829-2af4-4211-cd15-9645d51bfe79"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "UsageError: Missing filename, URL, input history range, macro, or element in the user namespace.\n"
     ]
    }
   ],
   "source": [
    "%load"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "bQlGbD2hoWmN"
   },
   "source": [
    "运行本地或网络中的Python文件，例如本地脚本文件的运行：%load xxx.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "collapsed": true,
    "id": "OnAgM1DqoWmO",
    "outputId": "7259f033-7665-4b70-ec75-2e7fcf23cbfb"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "%run:\n",
      " Run the named file inside IPython as a program.\n",
      "\n",
      "Usage::\n",
      "\n",
      "  %run [-n -i -e -G]\n",
      "       [( -t [-N<N>] | -d [-b<N>] | -p [profile options] )]\n",
      "       ( -m mod | file ) [args]\n",
      "\n",
      "Parameters after the filename are passed as command-line arguments to\n",
      "the program (put in sys.argv). Then, control returns to IPython's\n",
      "prompt.\n",
      "\n",
      "This is similar to running at a system prompt ``python file args``,\n",
      "but with the advantage of giving you IPython's tracebacks, and of\n",
      "loading all variables into your interactive namespace for further use\n",
      "(unless -p is used, see below).\n",
      "\n",
      "The file is executed in a namespace initially consisting only of\n",
      "``__name__=='__main__'`` and sys.argv constructed as indicated. It thus\n",
      "sees its environment as if it were being run as a stand-alone program\n",
      "(except for sharing global objects such as previously imported\n",
      "modules). But after execution, the IPython interactive namespace gets\n",
      "updated with all variables defined in the program (except for __name__\n",
      "and sys.argv). This allows for very convenient loading of code for\n",
      "interactive work, while giving each program a 'clean sheet' to run in.\n",
      "\n",
      "Arguments are expanded using shell-like glob match.  Patterns\n",
      "'*', '?', '[seq]' and '[!seq]' can be used.  Additionally,\n",
      "tilde '~' will be expanded into user's home directory.  Unlike\n",
      "real shells, quotation does not suppress expansions.  Use\n",
      "*two* back slashes (e.g. ``\\\\*``) to suppress expansions.\n",
      "To completely disable these expansions, you can use -G flag.\n",
      "\n",
      "On Windows systems, the use of single quotes `'` when specifying \n",
      "a file is not supported. Use double quotes `\"`.\n",
      "\n",
      "Options:\n",
      "\n",
      "-n\n",
      "  __name__ is NOT set to '__main__', but to the running file's name\n",
      "  without extension (as python does under import).  This allows running\n",
      "  scripts and reloading the definitions in them without calling code\n",
      "  protected by an ``if __name__ == \"__main__\"`` clause.\n",
      "\n",
      "-i\n",
      "  run the file in IPython's namespace instead of an empty one. This\n",
      "  is useful if you are experimenting with code written in a text editor\n",
      "  which depends on variables defined interactively.\n",
      "\n",
      "-e\n",
      "  ignore sys.exit() calls or SystemExit exceptions in the script\n",
      "  being run.  This is particularly useful if IPython is being used to\n",
      "  run unittests, which always exit with a sys.exit() call.  In such\n",
      "  cases you are interested in the output of the test results, not in\n",
      "  seeing a traceback of the unittest module.\n",
      "\n",
      "-t\n",
      "  print timing information at the end of the run.  IPython will give\n",
      "  you an estimated CPU time consumption for your script, which under\n",
      "  Unix uses the resource module to avoid the wraparound problems of\n",
      "  time.clock().  Under Unix, an estimate of time spent on system tasks\n",
      "  is also given (for Windows platforms this is reported as 0.0).\n",
      "\n",
      "If -t is given, an additional ``-N<N>`` option can be given, where <N>\n",
      "must be an integer indicating how many times you want the script to\n",
      "run.  The final timing report will include total and per run results.\n",
      "\n",
      "For example (testing the script uniq_stable.py)::\n",
      "\n",
      "    In [1]: run -t uniq_stable\n",
      "\n",
      "    IPython CPU timings (estimated):\n",
      "      User  :    0.19597 s.\n",
      "      System:        0.0 s.\n",
      "\n",
      "    In [2]: run -t -N5 uniq_stable\n",
      "\n",
      "    IPython CPU timings (estimated):\n",
      "    Total runs performed: 5\n",
      "      Times :      Total       Per run\n",
      "      User  :   0.910862 s,  0.1821724 s.\n",
      "      System:        0.0 s,        0.0 s.\n",
      "\n",
      "-d\n",
      "  run your program under the control of pdb, the Python debugger.\n",
      "  This allows you to execute your program step by step, watch variables,\n",
      "  etc.  Internally, what IPython does is similar to calling::\n",
      "\n",
      "      pdb.run('execfile(\"YOURFILENAME\")')\n",
      "\n",
      "  with a breakpoint set on line 1 of your file.  You can change the line\n",
      "  number for this automatic breakpoint to be <N> by using the -bN option\n",
      "  (where N must be an integer). For example::\n",
      "\n",
      "      %run -d -b40 myscript\n",
      "\n",
      "  will set the first breakpoint at line 40 in myscript.py.  Note that\n",
      "  the first breakpoint must be set on a line which actually does\n",
      "  something (not a comment or docstring) for it to stop execution.\n",
      "\n",
      "  Or you can specify a breakpoint in a different file::\n",
      "\n",
      "      %run -d -b myotherfile.py:20 myscript\n",
      "\n",
      "  When the pdb debugger starts, you will see a (Pdb) prompt.  You must\n",
      "  first enter 'c' (without quotes) to start execution up to the first\n",
      "  breakpoint.\n",
      "\n",
      "  Entering 'help' gives information about the use of the debugger.  You\n",
      "  can easily see pdb's full documentation with \"import pdb;pdb.help()\"\n",
      "  at a prompt.\n",
      "\n",
      "-p\n",
      "  run program under the control of the Python profiler module (which\n",
      "  prints a detailed report of execution times, function calls, etc).\n",
      "\n",
      "  You can pass other options after -p which affect the behavior of the\n",
      "  profiler itself. See the docs for %prun for details.\n",
      "\n",
      "  In this mode, the program's variables do NOT propagate back to the\n",
      "  IPython interactive namespace (because they remain in the namespace\n",
      "  where the profiler executes them).\n",
      "\n",
      "  Internally this triggers a call to %prun, see its documentation for\n",
      "  details on the options available specifically for profiling.\n",
      "\n",
      "There is one special usage for which the text above doesn't apply:\n",
      "if the filename ends with .ipy[nb], the file is run as ipython script,\n",
      "just as if the commands were written on IPython prompt.\n",
      "\n",
      "-m\n",
      "  specify module name to load instead of script path. Similar to\n",
      "  the -m option for the python interpreter. Use this option last if you\n",
      "  want to combine with other %run options. Unlike the python interpreter\n",
      "  only source modules are allowed no .pyc or .pyo files.\n",
      "  For example::\n",
      "\n",
      "      %run -m example\n",
      "\n",
      "  will run the example module.\n",
      "\n",
      "-G\n",
      "  disable shell-like glob expansion of arguments.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "E:\\Soft\\anaconda\\envs\\retinanet\\lib\\site-packages\\IPython\\core\\magics\\execution.py:699: UserWarning: you must provide at least a filename.\n",
      "  warn('you must provide at least a filename.')\n"
     ]
    }
   ],
   "source": [
    "%run"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Kjx1_9h9i4cu"
   },
   "source": [
    "## 当前目录内文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 377
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 9059,
     "status": "ok",
     "timestamp": 1578537569191,
     "user": {
      "displayName": "宏沉一笑",
      "photoUrl": "",
      "userId": "12018462559157601606"
     },
     "user_tz": -480
    },
    "id": "wnTF11Rli4cu",
    "outputId": "eefafb10-bcc2-492d-9b45-02fd1d92c489"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['checkpoint.pth.tar']\n",
      "total 545M\n",
      "drwxr-xr-x 2 root root 4.0K Jan  9 02:39 checkpoints\n",
      "drwxr-xr-x 4 root root 4.0K Dec  5 03:09 datasets\n",
      "drwx------ 4 root root 4.0K Jan  9 02:00 drive\n",
      "-rw-r--r-- 1 root root 1.5M Nov 19 07:20 ModelArts平台使用指导-pytorch-v1.0.pdf\n",
      "-rw-r--r-- 1 root root 181M Jan  9 02:20 model_best.pth.tar\n",
      "drwxr-xr-x 2 root root 4.0K Dec  5 03:11 model_snapshots\n",
      "drwxr-xr-x 1 root root 4.0K Dec 18 16:52 sample_data\n",
      "drwxr-xr-x 4 root root 4.0K Dec  5 03:07 src\n",
      "-rw------- 1 root root 363M Jan  8 10:07 xian.rar\n",
      "4.0K\tcheckpoints\n",
      "394M\tdatasets\n",
      "4.2G\tdrive\n",
      "1.5M\tModelArts平台使用指导-pytorch-v1.0.pdf\n",
      "181M\tmodel_best.pth.tar\n",
      "4.0K\tmodel_snapshots\n",
      "55M\tsample_data\n",
      "396K\tsrc\n",
      "363M\txian.rar\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "print(os.listdir('./checkpoints'))\n",
    "!rm checkpoints/checkpoint.pth.tar\n",
    "!ls -lh\n",
    "!du -sh *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "NUi3e_vNi4cz"
   },
   "source": [
    "## 当前路径"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 840,
     "status": "ok",
     "timestamp": 1578034525505,
     "user": {
      "displayName": "宏沉一笑",
      "photoUrl": "",
      "userId": "12018462559157601606"
     },
     "user_tz": -480
    },
    "id": "_m0afJXAi4c0",
    "outputId": "2e63545b-a2d3-42e1-f7c7-21f6c1c01cf2"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'/content'"
      ]
     },
     "execution_count": 2,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os\n",
    "os.getcwd()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Fp52um4Pi4c3"
   },
   "source": [
    "## 安装包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 2331,
     "status": "ok",
     "timestamp": 1578478819424,
     "user": {
      "displayName": "宏沉一笑",
      "photoUrl": "",
      "userId": "12018462559157601606"
     },
     "user_tz": -480
    },
    "id": "Nh7oJHjQi4c3",
    "outputId": "693530f7-c380-4a85-c2bd-01c3085c2442"
   },
   "outputs": [],
   "source": [
    "!conda install tensorboardX"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 233
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 11705,
     "status": "ok",
     "timestamp": 1578535880512,
     "user": {
      "displayName": "宏沉一笑",
      "photoUrl": "",
      "userId": "12018462559157601606"
     },
     "user_tz": -480
    },
    "id": "23LfddbHi4c6",
    "outputId": "bc85497a-5791-4b77-9221-bad7b30f0346"
   },
   "outputs": [],
   "source": [
    "!pip install tensorboardX\n",
    "!pip install torchsummaryX\n",
    "from torchsummaryX import summary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "hc0IiGSKmVrq"
   },
   "outputs": [],
   "source": [
    "os.mkdir('tmp')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "EXiKGvf0Lxob"
   },
   "source": [
    "## 改变代码运行位置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "AOvDaj0NLtBK"
   },
   "outputs": [],
   "source": [
    "os.chdir('')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "LmBjwLWpo03h"
   },
   "source": [
    "## Colab硬盘挂载"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 127
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 26360,
     "status": "ok",
     "timestamp": 1578535240919,
     "user": {
      "displayName": "宏沉一笑",
      "photoUrl": "",
      "userId": "12018462559157601606"
     },
     "user_tz": -480
    },
    "id": "A1SSuwFao-KL",
    "outputId": "eb9a929d-a52d-4c87-ce18-4b60767e52b8"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n",
      "\n",
      "Enter your authorization code:\n",
      "··········\n",
      "Mounted at /content/drive\n"
     ]
    }
   ],
   "source": [
    "from google.colab import drive\n",
    "drive.mount('/content/drive')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "STcRy_O3i4c9"
   },
   "source": [
    "# Tensorflow学习"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "YsoawU3Ji4c9"
   },
   "source": [
    "###----------------------------------------------------1、文件说明----------------------------------------------------###\n",
    "'''\n",
    "* 说明：Tensorflow学习\n",
    "* 时间：2019-12-21\n",
    "* 作者：whg\n",
    "'''"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "gdJBA5zxi4c9"
   },
   "source": [
    "## 库导入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "vwFglrk7i4c_",
    "outputId": "c2608502-274c-4656-8079-35068c9281a1"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "66R3JVkZi4dB"
   },
   "source": [
    "## 模型建立"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "06Ua5zQdi4dC"
   },
   "outputs": [],
   "source": [
    "v1 = tf.Variable(tf.constant(1.0, shape=[1]), name='v1')\n",
    "v2 = tf.Variable(tf.constant(2.0, shape=[1]), name='v2')\n",
    "result = v1 + v2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "B2-RHVsii4dE"
   },
   "source": [
    "## 模型运行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "5Wo_YWyCi4dF",
    "outputId": "1aff7947-2ce4-46b4-e496-62e406a4a570"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[3.]\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    print(sess.run(result))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "cVsxuxqMi4dI"
   },
   "source": [
    "## 模型保存 - 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "mPq0yBUbi4dJ"
   },
   "source": [
    "保存文件为  \n",
    "study-tensorflow.data-00000-of-00001  \n",
    "study-tensorflow.index  \n",
    "study-tensorflow.meta  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "bfk-DlK8i4dK"
   },
   "outputs": [],
   "source": [
    "saver = tf.train.Saver()\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    saver.save(sess, \"study-tensorflow\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "F7pyZga2i4dL"
   },
   "source": [
    "## 模型导入 - 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "VnkdEu_zi4dN",
    "outputId": "ff9ab543-ea07-4394-c067-031af4ae12f3",
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From E:\\Soft\\anaconda\\envs\\retinanet\\lib\\site-packages\\tensorflow\\python\\training\\saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n",
      "INFO:tensorflow:Restoring parameters from study-tensorflow\n",
      "[3.]\n"
     ]
    }
   ],
   "source": [
    "saver = tf.train.Saver()\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    saver.restore(sess, 'study-tensorflow')\n",
    "    print(sess.run(result))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "DK3zBw8Ii4dP"
   },
   "source": [
    "## 模型保存 - 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "3k1GeoRXi4dP"
   },
   "source": [
    "保存文件为  \n",
    " tensorflow_graph.pb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "V06SkfN3i4dQ",
    "outputId": "b10df2ff-795a-4ce4-97d5-78bcbe85ce32"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-21-1f7dcd19deab>:9: convert_variables_to_constants (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.compat.v1.graph_util.convert_variables_to_constants\n",
      "WARNING:tensorflow:From E:\\Soft\\anaconda\\envs\\retinanet\\lib\\site-packages\\tensorflow\\python\\framework\\graph_util_impl.py:245: extract_sub_graph (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.compat.v1.graph_util.extract_sub_graph\n",
      "INFO:tensorflow:Froze 2 variables.\n",
      "INFO:tensorflow:Converted 2 variables to const ops.\n"
     ]
    }
   ],
   "source": [
    "from tensorflow.python.framework import graph_util\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    graph_def = tf.get_default_graph().as_graph_def()\n",
    "    output_graph_def = graph_util.convert_variables_to_constants(\n",
    "        sess,\n",
    "        graph_def,\n",
    "        ['add']\n",
    "    )\n",
    "    \n",
    "    with tf.gfile.GFile(\"tensorflow_graph.pb\", \"wb\") as f:\n",
    "        f.write(output_graph_def.SerializeToString())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "PC4fwVzai4dT"
   },
   "outputs": [],
   "source": [
    "# help(graph_def)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "GqgdECbpi4dV",
    "outputId": "f296a0ec-b953-443b-d207-e043bfdbd10e"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4642"
      ]
     },
     "execution_count": 25,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "graph_def.ByteSize()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "d_unVPf_i4dZ"
   },
   "source": [
    "## 模型导入 - 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "-fT-tjvhi4da",
    "outputId": "fbad759a-8c66-4581-b5cb-1b7498b861c2"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'list'> ['v1:0', 'v2:0']\n",
      "[[<tf.Tensor 'import_22/v1:0' shape=(1,) dtype=float32>], [<tf.Tensor 'import_23/v2:0' shape=(1,) dtype=float32>]]\n",
      "[array([3.], dtype=float32)]\n"
     ]
    }
   ],
   "source": [
    "saver = tf.train.Saver()\n",
    "\n",
    "with tf.gfile.GFile(\"tensorflow_graph.pb\", \"rb\") as f:\n",
    "    graph_def = tf.GraphDef()\n",
    "    graph_def.ParseFromString(f.read())\n",
    "    _ = tf.import_graph_def(graph_def, name=\"\")\n",
    "        \n",
    "        \n",
    "with tf.Session() as sess:\n",
    "    trainable_variable = tf.trainable_variables()\n",
    "    variable_list_name = [c.name for c in trainable_variable]\n",
    "    print(type(variable_list_name), variable_list_name)\n",
    "    variable_list = []\n",
    "    for name in variable_list_name:\n",
    "        variable_list.append(tf.import_graph_def(graph_def, return_elements=[name]))\n",
    "    print(variable_list)\n",
    "    \n",
    "    result = tf.import_graph_def(graph_def, return_elements=['add:0'])\n",
    "    print(sess.run(result))\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "E5mugAuJi4dd"
   },
   "source": [
    "## 模型保存 - 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "mTNM2BURi4de",
    "outputId": "33e71deb-5af2-435b-d432-ec4a0ae77b78"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:No assets to save.\n",
      "INFO:tensorflow:No assets to write.\n",
      "INFO:tensorflow:SavedModel written to: study/tf/save_model3\\saved_model.pb\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    \n",
    "    # 准备存储模型\n",
    "    model_name = \"study/tf/save_model3\"\n",
    "    builder = tf.saved_model.builder.SavedModelBuilder(model_name)\n",
    "    \n",
    "    # 构建在新会话中需要恢复的变量的TensorInfo Probuf\n",
    "    X_TensorInfo = tf.saved_model.utils.build_tensor_info(v1)\n",
    "    Y_TensorInfo = tf.saved_model.utils.build_tensor_info(v2)\n",
    "    result_TensorInfo = tf.saved_model.utils.build_tensor_info(result)\n",
    "    # \n",
    "    SignatureDef = tf.saved_model.signature_def_utils.build_signature_def(\n",
    "        inputs = {\"input_1\" : X_TensorInfo, \"input_2\" : Y_TensorInfo},\n",
    "        outputs = {\"output\" : result_TensorInfo},\n",
    "        method_name=\"hycx\"\n",
    "    )\n",
    "    \n",
    "    # 将变量信息和graph等信息写入MetaGraphDef protobuf\n",
    "    builder.add_meta_graph_and_variables(sess, \n",
    "                                        tags=[tf.saved_model.tag_constants.TRAINING],\n",
    "                                        signature_def_map={tf.saved_model.signature_constants.CLASSIFY_INPUTS : SignatureDef}\n",
    "                                        )\n",
    "    \n",
    "    # 将 MetaGraphDef 写入磁盘\n",
    "    builder.save()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "0pNOLecAi4dh"
   },
   "source": [
    "## 模型导入 - 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "4itvy-Rsi4di",
    "outputId": "b63959f1-9d5d-436f-de1f-643ea82ad58e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from study/tf/save_model3\\variables\\variables\n",
      "- - - - - - - - - - - - - - - - - - - - - - - - - - - - \n",
      "- - - - - - - - - - - - - - - - - - - - - - - - - - - - \n",
      "- - - - - - - - - - - - - - - - - - - - - - - - - - - - \n"
     ]
    }
   ],
   "source": [
    "# 建立一个模型\n",
    "with tf.Session() as sess:\n",
    "    # 恢复模型\n",
    "    model_name = \"study/tf/save_model3\"\n",
    "    MetaGraphDef = tf.saved_model.loader.load(sess, \n",
    "                                              tags=[tf.saved_model.tag_constants.TRAINING],\n",
    "                                              export_dir=model_name)\n",
    "    print('- - - - - - - - - - - - - - - - - - - - - - - - - - - - ')\n",
    "#     print(MetaGraphDef)\n",
    "    # 解析得到 SignatureDef protobbuf\n",
    "    SignatureDef_d = MetaGraphDef.signature_def\n",
    "    print('- - - - - - - - - - - - - - - - - - - - - - - - - - - - ')\n",
    "#     print(SignatureDef_d)\n",
    "    SignatureDef   = SignatureDef_d[tf.saved_model.signature_constants.CLASSIFY_INPUTS]\n",
    "    print('- - - - - - - - - - - - - - - - - - - - - - - - - - - - ')\n",
    "#     print(SignatureDef)\n",
    "    \n",
    "    # 解析得到三个变量对应的 TensorInfo protobuf\n",
    "    X_TensorInfo = SignatureDef.inputs['input_1']\n",
    "    Y_TensorInfo = SignatureDef.inputs['input_2']\n",
    "    result_TensorInfo = SignatureDef.outputs['output']\n",
    "    \n",
    "    # - - - 第一种 - - -\n",
    "    # 解析得到 3 个变量对应的Tensorflow\n",
    "    # .get_tensor_from_tensor_info()  函数可以不传入graph参数，Tensorflow自动使用默认图\n",
    "    v1 = tf.saved_model.utils.get_tensor_from_tensor_info(X_TensorInfo, sess.graph)\n",
    "    v2 = tf.saved_model.utils.get_tensor_from_tensor_info(Y_TensorInfo, sess.graph)\n",
    "    result = tf.saved_model.utils.get_tensor_from_tensor_info(result_TensorInfo)\n",
    "#     print('First Method')\n",
    "#     print(v1)\n",
    "#     print(v2)\n",
    "#     print(result)\n",
    "#     print(sess.run(v1))\n",
    "#     print(sess.run(v2))\n",
    "#     print(sess.run(result))\n",
    "    \n",
    "    # - - - 第二种 - - -\n",
    "    # Tensorflow 构建 Tensorflow protobuf 时， 使用了Tensor 的 name 信息，可以直接读出来使用\n",
    "    x = sess.graph.get_tensor_by_name(X_TensorInfo.name)\n",
    "    y = sess.graph.get_tensor_by_name(Y_TensorInfo.name)\n",
    "    res = sess.graph.get_tensor_by_name(result_TensorInfo.name)\n",
    "#     print('\\nSecond Method')\n",
    "#     print(x)\n",
    "#     print(y)\n",
    "#     print(res)\n",
    "#     print(sess.run(x))\n",
    "#     print(sess.run(y))\n",
    "#     print(sess.run(res))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "HkgQbpAki4dl"
   },
   "source": [
    "# Pytorch学习"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "VHMROJN-i4dl"
   },
   "source": [
    "## 库导入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "vxmmZ53ei4dm"
   },
   "outputs": [],
   "source": [
    "import torch.optim as optim\n",
    "import torch.nn.functional as F\n",
    "from torch.autograd import Variable\n",
    "\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "from torchvision import transforms, utils\n",
    "from torchsummaryX import summary\n",
    "from tensorboardX import SummaryWriter\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.parallel\n",
    "import torch.backends.cudnn as cudnn\n",
    "import torch.distributed as dist\n",
    "\n",
    "import torch.multiprocessing as mp\n",
    "import torch.utils.data\n",
    "import torch.utils.data.distributed\n",
    "import torchvision.transforms as transforms\n",
    "import torchvision.datasets as datasets\n",
    "import torchvision.models as models\n",
    "from torch.utils.model_zoo import load_url as load_state_dict_from_url"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "rdAo3Oh7i4dp"
   },
   "source": [
    "## 参数配置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "EUyQtkvKi4dp"
   },
   "outputs": [],
   "source": [
    "gpu_flag = torch.cuda.is_available()\n",
    "\n",
    "torch.backends.cudnn.enabled = True\n",
    "\n",
    "torch.backends.cudnn.benchmark = True\n",
    "gpu_flag\n",
    "gpu_num=0\n",
    "# CUDA_LAUNCH_BLOCKING=1\n",
    "# CUDA_VISIBLE_DEVICES=1\n",
    "# torch.cuda.set_device(1)\n",
    "torch.cuda.empty_cache()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 1135,
     "status": "ok",
     "timestamp": 1578037273426,
     "user": {
      "displayName": "宏沉一笑",
      "photoUrl": "",
      "userId": "12018462559157601606"
     },
     "user_tz": -480
    },
    "id": "9N2AF1GPUbAa",
    "outputId": "d4471388-90ed-409a-abb8-3833c1d3796a"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 4,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.cuda.device_count()\n",
    "torch.cuda.current_stream()\n",
    "torch.cuda.current_device()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "mw72BliAVHzr"
   },
   "outputs": [],
   "source": [
    "parser = argparse.ArgumentParser(description='PyTorch ImageNet Training')\n",
    "parser.add_argument('--data', metavar='DIR',\n",
    "                    help='path to dataset')\n",
    "parser.add_argument('--j', '--workers', default=4, type=int, metavar='N',\n",
    "                    help='number of data loading workers (default: 4)')\n",
    "parser.add_argument('--epochs', default=90, type=int, metavar='N',\n",
    "                    help='number of total epochs to run')\n",
    "parser.add_argument('--start-epoch', default=0, type=int, metavar='N',\n",
    "                    help='manual epoch number (useful on restarts)')\n",
    "parser.add_argument('--b', '--batch-size', default=16, type=int,\n",
    "                    metavar='N',\n",
    "                    help='mini-batch size (default: 256), this is the total '\n",
    "                         'batch size of all GPUs on the current node when '\n",
    "                         'using Data Parallel or Distributed Data Parallel')\n",
    "parser.add_argument('--lr', '--learning-rate', default=0.001, type=float,\n",
    "                    metavar='LR', help='initial learning rate', dest='lr')\n",
    "parser.add_argument('--momentum', default=0.9, type=float, metavar='M',\n",
    "                    help='momentum')\n",
    "parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float,\n",
    "                    metavar='W', help='weight decay (default: 1e-4)',\n",
    "                    dest='weight_decay')\n",
    "parser.add_argument('--p', '--print-freq', default=10, type=int,\n",
    "                    metavar='N', help='print frequency (default: 10)')\n",
    "parser.add_argument('--resume', default='./checkpoints/checkpoint.pth.tar', type=str, metavar='PATH',\n",
    "                    help='path to latest checkpoint (default: none)')\n",
    "parser.add_argument('--e', '--evaluate', dest='evaluate', action='store_true',\n",
    "                    help='evaluate model on validation set')\n",
    "parser.add_argument('--pretrained', dest='pretrained', action='store_true',\n",
    "                    help='use pre-trained model')\n",
    "parser.add_argument('--world-size', default=-1, type=int,\n",
    "                    help='number of nodes for distributed training')\n",
    "parser.add_argument('--rank', default=-1, type=int,\n",
    "                    help='node rank for distributed training')\n",
    "parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str,\n",
    "                    help='url used to set up distributed training')\n",
    "parser.add_argument('--dist-backend', default='nccl', type=str,\n",
    "                    help='distributed backend')\n",
    "parser.add_argument('--seed', default=None, type=int,\n",
    "                    help='seed for initializing training. ')\n",
    "parser.add_argument('--gpu', default=0, type=int,\n",
    "                    help='GPU id to use.')\n",
    "parser.add_argument('--multiprocessing-distributed', action='store_true',\n",
    "                    help='Use multi-processing distributed training to launch '\n",
    "                         'N processes per node, which has N GPUs. This is the '\n",
    "                         'fastest way to use PyTorch for either single node or '\n",
    "                         'multi node data parallel training')\n",
    "\n",
    "args = parser.parse_args(args=[]) # 实际使用要删除\n",
    "best_acc1 = 0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "GCbA2C4mi4dr"
   },
   "source": [
    "## 模型建立"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Sg1KA-AnoWnR"
   },
   "source": [
    "### 模型下载"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "lGKyfqVSoWnV"
   },
   "outputs": [],
   "source": [
    "model_urls = {\n",
    "    'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth',\n",
    "    'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth',\n",
    "    'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth',\n",
    "    'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth',\n",
    "    'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth',\n",
    "    'resnext50_32x4d': 'https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth',\n",
    "    'resnext101_32x8d': 'https://download.pytorch.org/models/resnext101_32x8d-8ba56ff5.pth',\n",
    "    'wide_resnet50_2': 'https://download.pytorch.org/models/wide_resnet50_2-95faca4d.pth',\n",
    "    'wide_resnet101_2': 'https://download.pytorch.org/models/wide_resnet101_2-32ee1156.pth',\n",
    "    'maskrcnn_resnet50_fpn_coco': 'https://download.pytorch.org/models/maskrcnn_resnet50_fpn_coco-bf2d0c1e.pth',\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Ef02yuKPoWnX"
   },
   "source": [
    "### 激活函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Wd6IjXPKoWnX"
   },
   "source": [
    "\\begin{equation}\\label{eq:}\n",
    "\\mathrm{erf}(x) = \\frac{2}{\\sqrt{\\pi}} \\int_{0}^{x} e^{-t^2} dt\n",
    "\\end{equation}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "ResNet(\n",
       "  (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n",
       "  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "  (relu): ReLU(inplace=True)\n",
       "  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n",
       "  (layer1): Sequential(\n",
       "    (0): Bottleneck(\n",
       "      (conv1): Conv2d(64, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "      (downsample): Sequential(\n",
       "        (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "    )\n",
       "    (1): Bottleneck(\n",
       "      (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (2): Bottleneck(\n",
       "      (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "  )\n",
       "  (layer2): Sequential(\n",
       "    (0): Bottleneck(\n",
       "      (conv1): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "      (downsample): Sequential(\n",
       "        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
       "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "    )\n",
       "    (1): Bottleneck(\n",
       "      (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (2): Bottleneck(\n",
       "      (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (3): Bottleneck(\n",
       "      (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(256, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "  )\n",
       "  (layer3): Sequential(\n",
       "    (0): Bottleneck(\n",
       "      (conv1): Conv2d(512, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "      (downsample): Sequential(\n",
       "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
       "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "    )\n",
       "    (1): Bottleneck(\n",
       "      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (2): Bottleneck(\n",
       "      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (3): Bottleneck(\n",
       "      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (4): Bottleneck(\n",
       "      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (5): Bottleneck(\n",
       "      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(512, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "  )\n",
       "  (layer4): Sequential(\n",
       "    (0): Bottleneck(\n",
       "      (conv1): Conv2d(1024, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(1024, 1024, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "      (downsample): Sequential(\n",
       "        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
       "        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      )\n",
       "    )\n",
       "    (1): Bottleneck(\n",
       "      (conv1): Conv2d(2048, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(1024, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "    (2): Bottleneck(\n",
       "      (conv1): Conv2d(2048, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv2): Conv2d(1024, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
       "      (bn2): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (conv3): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
       "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
       "      (relu): ReLU(inplace=True)\n",
       "    )\n",
       "  )\n",
       "  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n",
       "  (fc): Linear(in_features=2048, out_features=1000, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "models.wide_resnet50_2()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "zIktEoNioWnY"
   },
   "outputs": [],
   "source": [
    "def gelu(input_tensor):\n",
    "    return torch.erf(input_tensor)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 损失函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "class FocalLoss(nn.Module):\n",
    "    def __init__(self, num_classes=20):\n",
    "        super(FocalLoss, self).__init__()\n",
    "        self.num_classes = num_classes\n",
    "\n",
    "    def focal_loss(self, x, y):\n",
    "        '''Focal loss.\n",
    "\n",
    "        Args:\n",
    "          x: (tensor) sized [N,D].\n",
    "          y: (tensor) sized [N,].\n",
    "\n",
    "        Return:\n",
    "          (tensor) focal loss.\n",
    "        '''\n",
    "        alpha = 0.25\n",
    "        gamma = 2\n",
    "\n",
    "        t = one_hot_embedding(y.data.cpu(), 1+self.num_classes)  # [N,21]\n",
    "        t = t[:,1:]  # exclude background\n",
    "        t = Variable(t).cuda()  # [N,20]\n",
    "\n",
    "        p = x.sigmoid()\n",
    "        pt = p*t + (1-p)*(1-t)         # pt = p if t > 0 else 1-p\n",
    "        w = alpha*t + (1-alpha)*(1-t)  # w = alpha if t > 0 else 1-alpha\n",
    "        w = w * (1-pt).pow(gamma)\n",
    "        return F.binary_cross_entropy_with_logits(x, t, w, size_average=False)\n",
    "\n",
    "    def focal_loss_alt(self, x, y):\n",
    "        '''Focal loss alternative.\n",
    "\n",
    "        Args:\n",
    "          x: (tensor) sized [N,D].\n",
    "          y: (tensor) sized [N,].\n",
    "\n",
    "        Return:\n",
    "          (tensor) focal loss.\n",
    "        '''\n",
    "        alpha = 0.25\n",
    "\n",
    "        t = one_hot_embedding(y.data.cpu(), 1+self.num_classes)\n",
    "        t = t[:,1:]\n",
    "        t = Variable(t).cuda()\n",
    "\n",
    "        xt = x*(2*t-1)  # xt = x if t > 0 else -x\n",
    "        pt = (2*xt+1).sigmoid()\n",
    "\n",
    "        w = alpha*t + (1-alpha)*(1-t)\n",
    "        loss = -w*pt.log() / 2\n",
    "        return loss.sum()\n",
    "\n",
    "    def forward(self, loc_preds, loc_targets, cls_preds, cls_targets):\n",
    "        '''Compute loss between (loc_preds, loc_targets) and (cls_preds, cls_targets).\n",
    "\n",
    "        Args:\n",
    "          loc_preds: (tensor) predicted locations, sized [batch_size, #anchors, 4].\n",
    "          loc_targets: (tensor) encoded target locations, sized [batch_size, #anchors, 4].\n",
    "          cls_preds: (tensor) predicted class confidences, sized [batch_size, #anchors, #classes].\n",
    "          cls_targets: (tensor) encoded target labels, sized [batch_size, #anchors].\n",
    "\n",
    "        loss:\n",
    "          (tensor) loss = SmoothL1Loss(loc_preds, loc_targets) + FocalLoss(cls_preds, cls_targets).\n",
    "        '''\n",
    "        batch_size, num_boxes = cls_targets.size()\n",
    "        pos = cls_targets > 0  # [N,#anchors]\n",
    "        num_pos = pos.data.long().sum()\n",
    "\n",
    "        ################################################################\n",
    "        # loc_loss = SmoothL1Loss(pos_loc_preds, pos_loc_targets)\n",
    "        ################################################################\n",
    "        mask = pos.unsqueeze(2).expand_as(loc_preds)       # [N,#anchors,4]\n",
    "        masked_loc_preds = loc_preds[mask].view(-1,4)      # [#pos,4]\n",
    "        masked_loc_targets = loc_targets[mask].view(-1,4)  # [#pos,4]\n",
    "        loc_loss = F.smooth_l1_loss(masked_loc_preds, masked_loc_targets, size_average=False)\n",
    "\n",
    "        ################################################################\n",
    "        # cls_loss = FocalLoss(loc_preds, loc_targets)\n",
    "        ################################################################\n",
    "        pos_neg = cls_targets > -1  # exclude ignored anchors\n",
    "        mask = pos_neg.unsqueeze(2).expand_as(cls_preds)\n",
    "        masked_cls_preds = cls_preds[mask].view(-1,self.num_classes)\n",
    "        cls_loss = self.focal_loss_alt(masked_cls_preds, cls_targets[pos_neg])\n",
    "\n",
    "        print('loc_loss: %.3f | cls_loss: %.3f' % (loc_loss.data[0]/num_pos, cls_loss.data[0]/num_pos), end=' | ')\n",
    "        loss = (loc_loss+cls_loss)/num_pos\n",
    "        return loss"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "gGQ934ooi4ds"
   },
   "source": [
    "### 模型层"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "3AEYdfTWi4dt"
   },
   "source": [
    "#### 通道注意力模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "t0u5ZTJTi4dt"
   },
   "outputs": [],
   "source": [
    "class ChannelAttention(nn.Module):\n",
    "    def __init__(self, in_planes, ratio=16):\n",
    "        super(ChannelAttention, self).__init__()\n",
    "        self.avg_pool = nn.AdaptiveAvgPool2d(1)\n",
    "        self.max_pool = nn.AdaptiveMaxPool2d(1)\n",
    "\n",
    "        self.fc1   = nn.Conv2d(in_planes, int(in_planes / 16) , 1, bias=False)\n",
    "        self.relu1 = nn.ReLU()\n",
    "        self.fc2   = nn.Conv2d(int(in_planes / 16), in_planes, 1, bias=False)\n",
    "\n",
    "        self.sigmoid = nn.Sigmoid()\n",
    "\n",
    "        \n",
    "    def forward(self, x):\n",
    "        avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x))))\n",
    "        max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x))))\n",
    "        out = avg_out + max_out\n",
    "        return self.sigmoid(out)\n",
    "        return x\n",
    "\n",
    "# if torch.cuda.is_available():\n",
    "#     channel = ChannelAttention(64).cuda()\n",
    "# else:\n",
    "#     channel = ChannelAttention(64)\n",
    "    \n",
    "# out = channel(torch.zeros(1, 64, 84, 84).cuda())\n",
    "# print(out.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "y1NlGdHdi4dw"
   },
   "source": [
    "#### 时间注意力模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "nVj0Nd7_i4dw"
   },
   "outputs": [],
   "source": [
    "class SpatialAttention(nn.Module):\n",
    "    def __init__(self, kernel_size=7):\n",
    "        super(SpatialAttention, self).__init__()\n",
    "\n",
    "        assert kernel_size in (3, 7), 'kernel size must be 3 or 7'\n",
    "        padding = 3 if kernel_size == 7 else 1\n",
    "\n",
    "        self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)\n",
    "        self.sigmoid = nn.Sigmoid()\n",
    "\n",
    "    def forward(self, x):\n",
    "        avg_out = torch.mean(x, dim=1, keepdim=True)\n",
    "        max_out, _ = torch.max(x, dim=1, keepdim=True)\n",
    "        x = torch.cat([avg_out, max_out], dim=1)\n",
    "        x = self.conv1(x)\n",
    "        return self.sigmoid(x)\n",
    "\n",
    "# if torch.cuda.is_available():\n",
    "#     spatial = SpatialAttention().cuda()\n",
    "# else:\n",
    "#     spatial = SpatialAttention()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "bzdnEKv4i4dy"
   },
   "source": [
    "#### 深度可分离卷积"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Qk3mlpJIi4dz"
   },
   "outputs": [],
   "source": [
    "def Depthwise_Conv(in_channel, out_channel, kernel, stride=1, padding=0, dilation=1):\n",
    "    layer = nn.Sequential(\n",
    "        nn.Conv2d(in_channel, out_channel, kernel, stride, padding, dilation=1),\n",
    "        nn.BatchNorm2d(out_channel, eps=1e-3),\n",
    "        nn.ReLU(True),\n",
    "        nn.Conv2d(out_channel, out_channel, kernel_size=1, stride=1, padding=0, dilation=1),\n",
    "        nn.BatchNorm2d(out_channel, eps=1e-3),\n",
    "        nn.ReLU(True)\n",
    "    )\n",
    "    return layer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "IZRAU8aJoWnm"
   },
   "source": [
    "#### 空洞卷积"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "7AWtMG2CoWnn"
   },
   "outputs": [],
   "source": [
    "def Atrous_Conv(in_channel, out_channel, kernel, stride=1, padding=0, dilation=2):\n",
    "    layer = nn.Sequential(\n",
    "        nn.Conv2d(in_channel, out_channel, kernel, stride, padding, dilation),\n",
    "        nn.BatchNorm2d(out_channel, eps=1e-3),\n",
    "        nn.ReLU(True),\n",
    "    )\n",
    "    return layer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "mpF5f3u8oWno"
   },
   "source": [
    "#### 3维卷积"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "B6nzL7-hoWnp"
   },
   "outputs": [],
   "source": [
    "class D3_Conv(nn.Module):\n",
    "    def __init__(self,  kernel, stride=1, padding=1, dilation=1):\n",
    "        super(D3_Conv, self).__init__()\n",
    "\n",
    "        self.conv3 = nn.Conv3d(1, 1, kernel_size=kernel, stride=stride, padding=padding, dilation=dilation)\n",
    "        self.bn = nn.BatchNorm2d(3, eps=1e-3)\n",
    "        self.ru = nn.ReLU('Ture')\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = torch.unsqueeze(x, 1)\n",
    "        x = self.conv3(x)\n",
    "        x = torch.squeeze(x, 1)\n",
    "        x = self.bn(x)\n",
    "        x = self.ru(x)\n",
    "        \n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "mjV8AF8ToWnq",
    "outputId": "ef0e97d2-a07e-4498-c4d9-a52cbd38454e"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([20, 3, 224, 224])"
      ]
     },
     "execution_count": 76,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = nn.Conv3d(16, 33, (3, 5, 2), stride=(2, 1, 1), padding=(4, 2, 0))\n",
    "# input = torch.autograd.Variable(torch.randn(20, 16, 10, 50, 100))\n",
    "input = torch.autograd.Variable(torch.randn(20, 3, 224, 224 ))\n",
    "# output = m(input)\n",
    "net = D3_Conv(kernel=(3,3,3))\n",
    "out = net(input)\n",
    "out.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "w4KpWOhfi4d1"
   },
   "source": [
    "### LeNet-5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "rakSbC9ui4d1"
   },
   "outputs": [],
   "source": [
    "# LeNet-5\n",
    "#输入大小为32x32\n",
    "class LenetNet(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(LenetNet, self).__init__()\n",
    "        self.conv1 = nn.Conv2d(3, 6, 5) \n",
    "        self.conv2 = nn.Conv2d(6, 16, 5)  \n",
    "        self.fc1   = nn.Linear(16*5*5, 120)  \n",
    "        self.fc2   = nn.Linear(120, 84)\n",
    "        self.fc3   = nn.Linear(84, 10)\n",
    "\n",
    "    def forward(self, x): \n",
    "        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) \n",
    "        x = F.max_pool2d(F.relu(self.conv2(x)), 2) \n",
    "        x = x.view(x.size()[0], -1) \n",
    "        x = F.relu(self.fc1(x))\n",
    "        x = F.relu(self.fc2(x))\n",
    "        x = self.fc3(x)        \n",
    "        return x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Qm1uhoU8i4d3"
   },
   "source": [
    "### AlexNet "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "XhkJeE82i4d4"
   },
   "outputs": [],
   "source": [
    "# AlexNet \n",
    "#输入大小为224x224\n",
    "class AlexNet(nn.Module):\n",
    "    def __init__(self, num_classes=1000):\n",
    "        super(AlexNet, self).__init__()\n",
    "        self.features = nn.Sequential(\n",
    "            nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),\n",
    "            nn.ReLU(inplace=True),\n",
    "            nn.MaxPool2d(kernel_size=3, stride=2),\n",
    "            nn.Conv2d(64, 192, kernel_size=5, padding=2),\n",
    "            nn.ReLU(inplace=True),\n",
    "            nn.MaxPool2d(kernel_size=3, stride=2),\n",
    "            nn.Conv2d(192, 384, kernel_size=3, padding=1),\n",
    "            nn.ReLU(inplace=True),\n",
    "            nn.Conv2d(384, 256, kernel_size=3, padding=1),\n",
    "            nn.ReLU(inplace=True),\n",
    "            nn.Conv2d(256, 256, kernel_size=3, padding=1),\n",
    "            nn.ReLU(inplace=True),\n",
    "            nn.MaxPool2d(kernel_size=3, stride=2),\n",
    "        )\n",
    "        self.classifier = nn.Sequential(\n",
    "            nn.Linear(256 * 6 * 6, 4096),\n",
    "            nn.ReLU(inplace=True),\n",
    "            nn.Linear(4096, 4096),\n",
    "            nn.ReLU(inplace=True),\n",
    "            nn.Linear(4096, num_classes),\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = self.features(x)\n",
    "        x = x.view(x.size(0), 256 * 6 * 6)\n",
    "        x = self.classifier(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "c9_3VIAXi4d5"
   },
   "source": [
    "### googlenet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Y-z_OEhLi4d6",
    "outputId": "ec1ab71f-509d-4614-cc91-36f8bf470d25"
   },
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'nn' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-2-af4cbe2bd7f8>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      6\u001b[0m     )\n\u001b[0;32m      7\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0mlayer\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 8\u001b[1;33m \u001b[1;32mclass\u001b[0m \u001b[0minception\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mModule\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      9\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0min_channel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout1_1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout2_1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout2_3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout3_1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout3_5\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout4_1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m         \u001b[0msuper\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minception\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'nn' is not defined"
     ]
    }
   ],
   "source": [
    "def conv_relu(in_channel, out_channel, kernel, stride=1, padding=0, dilation=1):\n",
    "    layer = nn.Sequential(\n",
    "        nn.Conv2d(in_channel, out_channel, kernel, stride, padding, dilation),\n",
    "        nn.BatchNorm2d(out_channel, eps=1e-3),\n",
    "        nn.ReLU(True)\n",
    "    )\n",
    "    return layer\n",
    "class inception(nn.Module):\n",
    "    def __init__(self, in_channel, out1_1, out2_1, out2_3, out3_1, out3_5, out4_1):\n",
    "        super(inception, self).__init__()\n",
    "        # 第一条线路\n",
    "        self.branch1x1 = conv_relu(in_channel, out1_1, 1)\n",
    "        \n",
    "        # 第二条线路\n",
    "        self.branch3x3 = nn.Sequential( \n",
    "            conv_relu(in_channel, out2_1, 1),\n",
    "            conv_relu(out2_1, out2_3, 3, padding=1)\n",
    "        )\n",
    "        \n",
    "        # 第三条线路\n",
    "        self.branch5x5 = nn.Sequential(\n",
    "            conv_relu(in_channel, out3_1, 1),\n",
    "            conv_relu(out3_1, out3_5, 5, padding=2)\n",
    "        )\n",
    "        \n",
    "        # 第四条线路\n",
    "        self.branch_pool = nn.Sequential(\n",
    "            nn.MaxPool2d(3, stride=1, padding=1),\n",
    "            conv_relu(in_channel, out4_1, 1)\n",
    "        )\n",
    "        \n",
    "    def forward(self, x):\n",
    "        f1 = self.branch1x1(x)\n",
    "        f2 = self.branch3x3(x)\n",
    "        f3 = self.branch5x5(x)\n",
    "        f4 = self.branch_pool(x)\n",
    "        output = torch.cat((f1, f2, f3, f4), dim=1)\n",
    "        return output\n",
    "\n",
    "# 输入为224x224，模型中输入的图片大小多少无所谓，只需要将模型的全连接层处的大小匹配就好\n",
    "class googlenet(nn.Module):\n",
    "    def __init__(self, in_channel, num_classes, verbose=False):\n",
    "        super(googlenet, self).__init__()\n",
    "        self.verbose = verbose\n",
    "        \n",
    "        self.block1 = nn.Sequential(\n",
    "            conv_relu(in_channel, out_channel=64, kernel=7, stride=2, padding=3),\n",
    "            nn.MaxPool2d(3, 2)\n",
    "        )\n",
    "        \n",
    "        self.block2 = nn.Sequential(\n",
    "            conv_relu(64, 64, kernel=1),\n",
    "            conv_relu(64, 192, kernel=3, padding=1),\n",
    "            nn.MaxPool2d(3, 2)\n",
    "        )\n",
    "        \n",
    "        self.block3 = nn.Sequential(\n",
    "            inception(192, 64, 96, 128, 16, 32, 32),\n",
    "            inception(256, 128, 128, 192, 32, 96, 64),\n",
    "            nn.MaxPool2d(3, 2)\n",
    "        )\n",
    "        \n",
    "        self.block4 = nn.Sequential(\n",
    "            inception(480, 192, 96, 208, 16, 48, 64),\n",
    "            inception(512, 160, 112, 224, 24, 64, 64),\n",
    "            inception(512, 128, 128, 256, 24, 64, 64),\n",
    "            inception(512, 112, 144, 288, 32, 64, 64),\n",
    "            inception(528, 256, 160, 320, 32, 128, 128),\n",
    "            nn.MaxPool2d(3, 2)\n",
    "        )\n",
    "        \n",
    "        self.block5 = nn.Sequential(\n",
    "            inception(832, 256, 160, 320, 32, 128, 128),\n",
    "            inception(832, 384, 182, 384, 48, 128, 128),\n",
    "            nn.AvgPool2d(2)\n",
    "        )\n",
    "        \n",
    "        self.classifier = nn.Linear(9216, num_classes)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        x = self.block1(x)\n",
    "        if self.verbose:\n",
    "            print('block 1 output: {}'.format(x.shape))\n",
    "        x = self.block2(x)\n",
    "        if self.verbose:\n",
    "            print('block 2 output: {}'.format(x.shape))\n",
    "        x = self.block3(x)\n",
    "        if self.verbose:\n",
    "            print('block 3 output: {}'.format(x.shape))\n",
    "        x = self.block4(x)\n",
    "        if self.verbose:\n",
    "            print('block 4 output: {}'.format(x.shape))\n",
    "        x = self.block5(x)\n",
    "        if self.verbose:\n",
    "            print('block 5 output: {}'.format(x.shape))\n",
    "        x = x.view(x.shape[0], -1)\n",
    "        x = self.classifier(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "4eBDXcb-i4d8"
   },
   "source": [
    "### VGGNet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "5ioTozU_i4d8"
   },
   "outputs": [],
   "source": [
    "# 一个 vgg 的 block，传入三个参数，第一个是模型层数，第二个是输入的通道数，第三个是输出的通道数，第一\n",
    "#层卷积接受的输入通道就是图片输入的通道数，然后输出最后的输出通道数，后面的卷积接受的通道数就是最后\n",
    "#的输出通道数\n",
    "def vgg_block(num_convs, in_channels, out_channels):\n",
    "    net = [nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1), nn.ReLU(True)] # 定义第一层\n",
    "    \n",
    "    for i in range(num_convs-1): # 定义后面的很多层\n",
    "        net.append(nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1))\n",
    "        net.append(nn.ReLU(True))\n",
    "        \n",
    "    net.append(nn.MaxPool2d(2, 2)) # 定义池化层\n",
    "    return nn.Sequential(*net)\n",
    "\n",
    "#函数对 vgg block 进行堆叠\n",
    "def vgg_stack(num_convs, channels):\n",
    "    net = []\n",
    "    for n, c in zip(num_convs, channels):\n",
    "        in_c = c[0]\n",
    "        out_c = c[1]\n",
    "        net.append(vgg_block(n, in_c, out_c))\n",
    "    return nn.Sequential(*net)\n",
    "\n",
    "#vgg模型\n",
    "class vgg(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(vgg, self).__init__()\n",
    "        self.feature = vgg_net\n",
    "        self.fc = nn.Sequential(\n",
    "            nn.Linear(512, 100),\n",
    "            nn.ReLU(True),\n",
    "            nn.Linear(100, 10)\n",
    "        )\n",
    "    def forward(self, x):\n",
    "        x = self.feature(x)\n",
    "        x = x.view(x.shape[0], -1)\n",
    "        x = self.fc(x)\n",
    "        return x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "30XVoQzJoWn0"
   },
   "source": [
    "### ResNet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "HMQpZOKxoWn1"
   },
   "outputs": [],
   "source": [
    "def conv3x3(in_planes, out_planes, stride=1, groups=1, dilation=1):\n",
    "    \"\"\"3x3 convolution with padding\"\"\"\n",
    "    return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,\n",
    "                     padding=dilation, groups=groups, bias=False, dilation=dilation)\n",
    "\n",
    "\n",
    "def conv1x1(in_planes, out_planes, stride=1):\n",
    "    \"\"\"1x1 convolution\"\"\"\n",
    "    return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False)\n",
    "\n",
    "\n",
    "class BasicBlock(nn.Module):\n",
    "    expansion = 1\n",
    "\n",
    "    def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1,\n",
    "                 base_width=64, dilation=1, norm_layer=None):\n",
    "        super(BasicBlock, self).__init__()\n",
    "        if norm_layer is None:\n",
    "            norm_layer = nn.BatchNorm2d\n",
    "        if groups != 1 or base_width != 64:\n",
    "            raise ValueError('BasicBlock only supports groups=1 and base_width=64')\n",
    "        if dilation > 1:\n",
    "            raise NotImplementedError(\"Dilation > 1 not supported in BasicBlock\")\n",
    "        # Both self.conv1 and self.downsample layers downsample the input when stride != 1\n",
    "        self.conv1 = conv3x3(inplanes, planes, stride)\n",
    "        self.bn1 = norm_layer(planes)\n",
    "        self.relu = nn.ReLU(inplace=True)\n",
    "        self.conv2 = conv3x3(planes, planes)\n",
    "        self.bn2 = norm_layer(planes)\n",
    "        self.downsample = downsample\n",
    "        self.stride = stride\n",
    "\n",
    "    def forward(self, x):\n",
    "        identity = x\n",
    "\n",
    "        out = self.conv1(x)\n",
    "        out = self.bn1(out)\n",
    "        out = self.relu(out)\n",
    "\n",
    "        out = self.conv2(out)\n",
    "        out = self.bn2(out)\n",
    "\n",
    "        if self.downsample is not None:\n",
    "            identity = self.downsample(x)\n",
    "\n",
    "        out += identity\n",
    "        out = self.relu(out)\n",
    "\n",
    "        return out\n",
    "\n",
    "\n",
    "class Bottleneck(nn.Module):\n",
    "    expansion = 4\n",
    "\n",
    "    def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1,\n",
    "                 base_width=64, dilation=1, norm_layer=None):\n",
    "        super(Bottleneck, self).__init__()\n",
    "        if norm_layer is None:\n",
    "            norm_layer = nn.BatchNorm2d\n",
    "        width = int(planes * (base_width / 64.)) * groups\n",
    "        # Both self.conv2 and self.downsample layers downsample the input when stride != 1\n",
    "        self.conv1 = conv1x1(inplanes, width)\n",
    "        self.bn1 = norm_layer(width)\n",
    "        self.conv2 = conv3x3(width, width, stride, groups, dilation)\n",
    "        self.bn2 = norm_layer(width)\n",
    "        self.conv3 = conv1x1(width, planes * self.expansion)\n",
    "        self.bn3 = norm_layer(planes * self.expansion)\n",
    "        self.relu = nn.ReLU(inplace=True)\n",
    "        self.downsample = downsample\n",
    "        self.stride = stride\n",
    "\n",
    "    def forward(self, x):\n",
    "        identity = x\n",
    "\n",
    "        out = self.conv1(x)\n",
    "        out = self.bn1(out)\n",
    "        out = self.relu(out)\n",
    "\n",
    "        out = self.conv2(out)\n",
    "        out = self.bn2(out)\n",
    "        out = self.relu(out)\n",
    "\n",
    "        out = self.conv3(out)\n",
    "        out = self.bn3(out)\n",
    "\n",
    "        if self.downsample is not None:\n",
    "            identity = self.downsample(x)\n",
    "\n",
    "        out += identity\n",
    "        out = self.relu(out)\n",
    "\n",
    "        return out\n",
    "\n",
    "\n",
    "class ResNet(nn.Module):\n",
    "\n",
    "    def __init__(self, block, layers, num_classes=1000, zero_init_residual=False,\n",
    "                 groups=1, width_per_group=64, replace_stride_with_dilation=None,\n",
    "                 norm_layer=None):\n",
    "        super(ResNet, self).__init__()\n",
    "        print(block)\n",
    "        if norm_layer is None:\n",
    "            norm_layer = nn.BatchNorm2d\n",
    "        self._norm_layer = norm_layer\n",
    "\n",
    "        self.inplanes = 64\n",
    "        self.dilation = 1\n",
    "        if replace_stride_with_dilation is None:\n",
    "            # each element in the tuple indicates if we should replace\n",
    "            # the 2x2 stride with a dilated convolution instead\n",
    "            replace_stride_with_dilation = [False, False, False]\n",
    "        if len(replace_stride_with_dilation) != 3:\n",
    "            raise ValueError(\"replace_stride_with_dilation should be None \"\n",
    "                             \"or a 3-element tuple, got {}\".format(replace_stride_with_dilation))\n",
    "        self.groups = groups\n",
    "        self.base_width = width_per_group\n",
    "        self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=7, stride=2, padding=3,\n",
    "                               bias=False)\n",
    "        self.bn1 = norm_layer(self.inplanes)\n",
    "        self.relu = nn.ReLU(inplace=True)\n",
    "        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)\n",
    "\n",
    "        self.layer1 = self._make_layer(block, 64, layers[0])\n",
    "        self.layer2 = self._make_layer(block, 128, layers[1], stride=2,\n",
    "                                       dilate=replace_stride_with_dilation[0])\n",
    "        self.layer3 = self._make_layer(block, 256, layers[2], stride=2,\n",
    "                                       dilate=replace_stride_with_dilation[1])\n",
    "        self.layer4 = self._make_layer(block, 512, layers[3], stride=2,\n",
    "                                       dilate=replace_stride_with_dilation[2])\n",
    "        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))\n",
    "        self.fc = nn.Linear(512 * block.expansion, num_classes)\n",
    "\n",
    "        for m in self.modules():\n",
    "            if isinstance(m, nn.Conv2d):\n",
    "                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')\n",
    "            elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)):\n",
    "                nn.init.constant_(m.weight, 1)\n",
    "                nn.init.constant_(m.bias, 0)\n",
    "\n",
    "        # Zero-initialize the last BN in each residual branch,\n",
    "        # so that the residual branch starts with zeros, and each residual block behaves like an identity.\n",
    "        # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677\n",
    "        if zero_init_residual:\n",
    "            for m in self.modules():\n",
    "                if isinstance(m, Bottleneck):\n",
    "                    nn.init.constant_(m.bn3.weight, 0)\n",
    "                elif isinstance(m, BasicBlock):\n",
    "                    nn.init.constant_(m.bn2.weight, 0)\n",
    "\n",
    "    def _make_layer(self, block, planes, blocks, stride=1, dilate=False):\n",
    "        norm_layer = self._norm_layer\n",
    "        downsample = None\n",
    "        previous_dilation = self.dilation\n",
    "        if dilate:\n",
    "            self.dilation *= stride\n",
    "            stride = 1\n",
    "        if stride != 1 or self.inplanes != planes * block.expansion:\n",
    "            downsample = nn.Sequential(\n",
    "                conv1x1(self.inplanes, planes * block.expansion, stride),\n",
    "                norm_layer(planes * block.expansion),\n",
    "            )\n",
    "\n",
    "        layers = []\n",
    "        layers.append(block(self.inplanes, planes, stride, downsample, self.groups,\n",
    "                            self.base_width, previous_dilation, norm_layer))\n",
    "        self.inplanes = planes * block.expansion\n",
    "        for _ in range(1, blocks):\n",
    "            layers.append(block(self.inplanes, planes, groups=self.groups,\n",
    "                                base_width=self.base_width, dilation=self.dilation,\n",
    "                                norm_layer=norm_layer))\n",
    "\n",
    "\n",
    "        return nn.Sequential(*layers)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = self.conv1(x)\n",
    "        x = self.bn1(x)\n",
    "        x = self.relu(x)\n",
    "        x = self.maxpool(x)\n",
    "\n",
    "        x = self.layer1(x)\n",
    "        x = self.layer2(x)\n",
    "        x = self.layer3(x)\n",
    "        x = self.layer4(x)\n",
    "\n",
    "#         x = self.avgpool(x)\n",
    "#         # 矩阵按行展开\n",
    "#         x = torch.flatten(x, 1)\n",
    "#         x = self.fc(x)\n",
    "\n",
    "        return x\n",
    "\n",
    "\n",
    "def _resnet(arch, block, layers, pretrained, progress, **kwargs):\n",
    "    model = ResNet(block, layers, **kwargs)\n",
    "    if pretrained:\n",
    "        state_dict = load_state_dict_from_url(model_urls[arch], progress=progress)\n",
    "        new_state_dict = model.state_dict()\n",
    "        new_state_dict.update(state_dict)\n",
    "        model.load_state_dict(new_state_dict)\n",
    "    return model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "uyCHO5-PoWn2"
   },
   "source": [
    "#### resnet18"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "bebCRaKsoWn2"
   },
   "outputs": [],
   "source": [
    "def resnet18(pretrained=False, progress=True, **kwargs):\n",
    "    r\"\"\"ResNet-18 model from\n",
    "    `\"Deep Residual Learning for Image Recognition\" <https://arxiv.org/pdf/1512.03385.pdf>`_\n",
    "\n",
    "    Args:\n",
    "        pretrained (bool): If True, returns a model pre-trained on ImageNet\n",
    "        progress (bool): If True, displays a progress bar of the download to stderr\n",
    "    \"\"\"\n",
    "    return _resnet('resnet18', BasicBlock, [2, 2, 2, 2], pretrained, progress,\n",
    "                   **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "J5gfxtVOoWn7"
   },
   "source": [
    "#### resnet34"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "nmmiX3Z2oWn7"
   },
   "outputs": [],
   "source": [
    "def resnet34(pretrained=False, progress=True, **kwargs):\n",
    "    r\"\"\"ResNet-34 model from\n",
    "    `\"Deep Residual Learning for Image Recognition\" <https://arxiv.org/pdf/1512.03385.pdf>`_\n",
    "\n",
    "    Args:\n",
    "        pretrained (bool): If True, returns a model pre-trained on ImageNet\n",
    "        progress (bool): If True, displays a progress bar of the download to stderr\n",
    "    \"\"\"\n",
    "    return _resnet('resnet34', BasicBlock, [3, 4, 6, 3], pretrained, progress,\n",
    "                   **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "3Febg1UZoWn-"
   },
   "source": [
    "#### resnet50"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "M_vFQCqzoWn_"
   },
   "outputs": [],
   "source": [
    "def resnet50(pretrained=False, progress=True, **kwargs):\n",
    "    r\"\"\"ResNet-50 model from\n",
    "    `\"Deep Residual Learning for Image Recognition\" <https://arxiv.org/pdf/1512.03385.pdf>`_\n",
    "\n",
    "    Args:\n",
    "        pretrained (bool): If True, returns a model pre-trained on ImageNet\n",
    "        progress (bool): If True, displays a progress bar of the download to stderr\n",
    "    \"\"\"\n",
    "    return _resnet('resnet50', Bottleneck, [3, 4, 6, 3], pretrained, progress,\n",
    "                   **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "9-zdi638oWoC"
   },
   "source": [
    "#### resnet101"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "vlTjxk7PoWoD"
   },
   "outputs": [],
   "source": [
    "def resnet101(pretrained=False, progress=True, **kwargs):\n",
    "    r\"\"\"ResNet-101 model from\n",
    "    `\"Deep Residual Learning for Image Recognition\" <https://arxiv.org/pdf/1512.03385.pdf>`_\n",
    "\n",
    "    Args:\n",
    "        pretrained (bool): If True, returns a model pre-trained on ImageNet\n",
    "        progress (bool): If True, displays a progress bar of the download to stderr\n",
    "    \"\"\"\n",
    "    return _resnet('resnet101', Bottleneck, [3, 4, 23, 3], pretrained, progress,\n",
    "                   **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "lWvUtN_VoWoF"
   },
   "source": [
    "#### resnet152"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "_LVdk4gCoWoF"
   },
   "outputs": [],
   "source": [
    "def resnet152(pretrained=False, progress=True, **kwargs):\n",
    "    r\"\"\"ResNet-152 model from\n",
    "    `\"Deep Residual Learning for Image Recognition\" <https://arxiv.org/pdf/1512.03385.pdf>`_\n",
    "\n",
    "    Args:\n",
    "        pretrained (bool): If True, returns a model pre-trained on ImageNet\n",
    "        progress (bool): If True, displays a progress bar of the download to stderr\n",
    "    \"\"\"\n",
    "    return _resnet('resnet152', Bottleneck, [3, 8, 36, 3], pretrained, progress,\n",
    "                   **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "pHVYlJ-qoWoH"
   },
   "source": [
    "#### resnext50_32x4d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "S8XjYq5QoWoI"
   },
   "outputs": [],
   "source": [
    "def resnext50_32x4d(pretrained=False, progress=True, **kwargs):\n",
    "    r\"\"\"ResNeXt-50 32x4d model from\n",
    "    `\"Aggregated Residual Transformation for Deep Neural Networks\" <https://arxiv.org/pdf/1611.05431.pdf>`_\n",
    "\n",
    "    Args:\n",
    "        pretrained (bool): If True, returns a model pre-trained on ImageNet\n",
    "        progress (bool): If True, displays a progress bar of the download to stderr\n",
    "    \"\"\"\n",
    "    kwargs['groups'] = 32\n",
    "    kwargs['width_per_group'] = 4\n",
    "    return _resnet('resnext50_32x4d', Bottleneck, [3, 4, 6, 3],\n",
    "                   pretrained, progress, **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "72tqyUdooWoM"
   },
   "source": [
    "#### resnext101_32x8d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "KC1LxZjPoWoN"
   },
   "outputs": [],
   "source": [
    "def resnext101_32x8d(pretrained=False, progress=True, **kwargs):\n",
    "    r\"\"\"ResNeXt-101 32x8d model from\n",
    "    `\"Aggregated Residual Transformation for Deep Neural Networks\" <https://arxiv.org/pdf/1611.05431.pdf>`_\n",
    "\n",
    "    Args:\n",
    "        pretrained (bool): If True, returns a model pre-trained on ImageNet\n",
    "        progress (bool): If True, displays a progress bar of the download to stderr\n",
    "    \"\"\"\n",
    "    kwargs['groups'] = 32\n",
    "    kwargs['width_per_group'] = 8\n",
    "    return _resnet('resnext101_32x8d', Bottleneck, [3, 4, 23, 3],\n",
    "                   pretrained, progress, **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "uAPheKH5oWoQ"
   },
   "source": [
    "#### resnext101_32x16d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "b3lN3SK_oWoQ"
   },
   "outputs": [],
   "source": [
    "def resnext101_32x16d(pretrained=False, progress=True, **kwargs):\n",
    "    r\"\"\"ResNeXt-101 32x8d model from\n",
    "    `\"Aggregated Residual Transformation for Deep Neural Networks\" <https://arxiv.org/pdf/1611.05431.pdf>`_\n",
    "\n",
    "    Args:\n",
    "        pretrained (bool): If True, returns a model pre-trained on ImageNet\n",
    "        progress (bool): If True, displays a progress bar of the download to stderr\n",
    "    \"\"\"\n",
    "    kwargs['groups'] = 32\n",
    "    kwargs['width_per_group'] = 16\n",
    "    return _resnet('resnext101_32x8d', Bottleneck, [3, 4, 23, 3],\n",
    "                   pretrained, progress, **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Dvn1P14HoWoS"
   },
   "source": [
    "#### resnext101_32x32d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "5ai-28NKoWoS"
   },
   "outputs": [],
   "source": [
    "def resnext101_32x32d(pretrained=False, progress=True, **kwargs):\n",
    "    r\"\"\"ResNeXt-101 32x8d model from\n",
    "    `\"Aggregated Residual Transformation for Deep Neural Networks\" <https://arxiv.org/pdf/1611.05431.pdf>`_\n",
    "\n",
    "    Args:\n",
    "        pretrained (bool): If True, returns a model pre-trained on ImageNet\n",
    "        progress (bool): If True, displays a progress bar of the download to stderr\n",
    "    \"\"\"\n",
    "    kwargs['groups'] = 32\n",
    "    kwargs['width_per_group'] = 32\n",
    "    return _resnet('resnext101_32x8d', Bottleneck, [3, 4, 23, 3],\n",
    "                   pretrained, progress, **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "3ndU4zU5oWoT"
   },
   "source": [
    "#### resnext101_32x48d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Kg75mYoRoWoU"
   },
   "outputs": [],
   "source": [
    "def resnext101_32x48d(pretrained=False, progress=True, **kwargs):\n",
    "    r\"\"\"ResNeXt-101 32x8d model from\n",
    "    `\"Aggregated Residual Transformation for Deep Neural Networks\" <https://arxiv.org/pdf/1611.05431.pdf>`_\n",
    "\n",
    "    Args:\n",
    "        pretrained (bool): If True, returns a model pre-trained on ImageNet\n",
    "        progress (bool): If True, displays a progress bar of the download to stderr\n",
    "    \"\"\"\n",
    "    kwargs['groups'] = 32\n",
    "    kwargs['width_per_group'] = 48\n",
    "    return _resnet('resnext101_32x8d', Bottleneck, [3, 4, 23, 3],\n",
    "                   pretrained, progress, **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Dt-kuYEaoWoV"
   },
   "source": [
    "#### wide_resnet50_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "eRBBlVSroWoW"
   },
   "outputs": [],
   "source": [
    "def wide_resnet50_2(pretrained=False, progress=True, **kwargs):\n",
    "    r\"\"\"Wide ResNet-50-2 model from\n",
    "    `\"Wide Residual Networks\" <https://arxiv.org/pdf/1605.07146.pdf>`_\n",
    "\n",
    "    The model is the same as ResNet except for the bottleneck number of channels\n",
    "    which is twice larger in every block. The number of channels in outer 1x1\n",
    "    convolutions is the same, e.g. last block in ResNet-50 has 2048-512-2048\n",
    "    channels, and in Wide ResNet-50-2 has 2048-1024-2048.\n",
    "\n",
    "    Args:\n",
    "        pretrained (bool): If True, returns a model pre-trained on ImageNet\n",
    "        progress (bool): If True, displays a progress bar of the download to stderr\n",
    "    \"\"\"\n",
    "    kwargs['width_per_group'] = 64 * 2\n",
    "    return _resnet('wide_resnet50_2', Bottleneck, [3, 4, 6, 3],\n",
    "                   pretrained, progress, **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "V2Ilf9wyoWoX"
   },
   "source": [
    "#### wide_resnet101_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "O2NT-NedoWoY"
   },
   "outputs": [],
   "source": [
    "def wide_resnet101_2(pretrained=False, progress=True, **kwargs):\n",
    "    r\"\"\"Wide ResNet-101-2 model from\n",
    "    `\"Wide Residual Networks\" <https://arxiv.org/pdf/1605.07146.pdf>`_\n",
    "\n",
    "    The model is the same as ResNet except for the bottleneck number of channels\n",
    "    which is twice larger in every block. The number of channels in outer 1x1\n",
    "    convolutions is the same, e.g. last block in ResNet-50 has 2048-512-2048\n",
    "    channels, and in Wide ResNet-50-2 has 2048-1024-2048.\n",
    "\n",
    "    Args:\n",
    "        pretrained (bool): If True, returns a model pre-trained on ImageNet\n",
    "        progress (bool): If True, displays a progress bar of the download to stderr\n",
    "    \"\"\"\n",
    "    kwargs['width_per_group'] = 64 * 2\n",
    "    return _resnet('wide_resnet101_2', Bottleneck, [3, 4, 23, 3],\n",
    "                   pretrained, progress, **kwargs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### RetinaNet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Bottleneck(nn.Module):\n",
    "    expansion = 4\n",
    "\n",
    "    def __init__(self, in_planes, planes, stride=1):\n",
    "        super(Bottleneck, self).__init__()\n",
    "        self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=1, bias=False)  # 图片大小不变\n",
    "        self.bn1 = nn.BatchNorm2d(planes)\n",
    "\n",
    "        self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False) # stride=1 图片大小不变\n",
    "        self.bn2 = nn.BatchNorm2d(planes)                                                           # stride=2 图片变小一倍\n",
    "\n",
    "        self.conv3 = nn.Conv2d(planes, self.expansion*planes, kernel_size=1, bias=False) # 图片大小不变\n",
    "        self.bn3 = nn.BatchNorm2d(self.expansion*planes)\n",
    "\n",
    "        self.downsample = nn.Sequential()\n",
    "        if stride != 1 or in_planes != self.expansion*planes:\n",
    "            self.downsample = nn.Sequential(\n",
    "                nn.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False),  # stride=1 图片大小不变\n",
    "                nn.BatchNorm2d(self.expansion * planes)                                                 # stride=2 图片变小一倍\n",
    "\n",
    "            )\n",
    "\n",
    "    def forward(self, x):\n",
    "        out = F.relu(self.bn1(self.conv1(x)))\n",
    "        out = F.relu(self.bn2(self.conv2(out)))\n",
    "        out = self.bn3(self.conv3(out))\n",
    "        out += self.downsample(x)\n",
    "        out = F.relu(out)\n",
    "        return out\n",
    "\n",
    "\n",
    "class FPN(nn.Module):\n",
    "    def __init__(self, block, num_blocks):\n",
    "        super(FPN, self).__init__()\n",
    "        self.in_planes = 64\n",
    "\n",
    "        self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)\n",
    "        self.bn1 = nn.BatchNorm2d(64)\n",
    "\n",
    "        # Bottom-up layers\n",
    "        # 上采样层\n",
    "        self.layer1 = self._make_layer(block,  64, num_blocks[0], stride=1)\n",
    "        self.layer2 = self._make_layer(block, 128, num_blocks[1], stride=2)\n",
    "        self.layer3 = self._make_layer(block, 256, num_blocks[2], stride=2)\n",
    "        self.layer4 = self._make_layer(block, 512, num_blocks[3], stride=2)\n",
    "        self.conv6 = nn.Conv2d(2048, 256, kernel_size=3, stride=2, padding=1)\n",
    "        self.conv7 = nn.Conv2d( 256, 256, kernel_size=3, stride=2, padding=1)\n",
    "\n",
    "        # Lateral layers\n",
    "        # 横向层\n",
    "        self.latlayer1 = nn.Conv2d(2048, 256, kernel_size=1, stride=1, padding=0)\n",
    "        self.latlayer2 = nn.Conv2d(1024, 256, kernel_size=1, stride=1, padding=0)\n",
    "        self.latlayer3 = nn.Conv2d( 512, 256, kernel_size=1, stride=1, padding=0)\n",
    "\n",
    "        # Top-down layers\n",
    "        # 下采样层\n",
    "        self.toplayer1 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1)\n",
    "        self.toplayer2 = nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1)\n",
    "\n",
    "    def _make_layer(self, block, planes, num_blocks, stride):\n",
    "        strides = [stride] + [1]*(num_blocks-1)\n",
    "        print(strides)\n",
    "        layers = []\n",
    "        for stride in strides:\n",
    "            layers.append(block(self.in_planes, planes, stride))\n",
    "            self.in_planes = planes * block.expansion\n",
    "        return nn.Sequential(*layers)\n",
    "\n",
    "    def _upsample_add(self, x, y):\n",
    "        '''Upsample and add two feature maps.\n",
    "\n",
    "        Args:\n",
    "          x: 上采样的feature map图\n",
    "          x: (Variable) top feature map to be upsampled.\n",
    "          y: 横向特征图\n",
    "          y: (Variable) lateral feature map.\n",
    "\n",
    "        Returns:\n",
    "          (Variable) added feature map.\n",
    "\n",
    "        Note in PyTorch, when input size is odd, the upsampled feature map\n",
    "        with `F.upsample(..., scale_factor=2, mode='nearest')`\n",
    "        maybe not equal to the lateral feature map size.\n",
    "\n",
    "        e.g.\n",
    "        original input size: [N,_,15,15] ->\n",
    "        conv2d feature map size: [N,_,8,8] ->\n",
    "        upsampled feature map size: [N,_,16,16]\n",
    "\n",
    "        So we choose bilinear upsample which supports arbitrary output sizes.\n",
    "        '''\n",
    "        _,_,H,W = y.size()\n",
    "        return F.upsample(x, size=(H,W), mode='bilinear') + y\n",
    "\n",
    "    def forward(self, x):\n",
    "        # Bottom-up\n",
    "        c1 = F.relu(self.bn1(self.conv1(x)))\n",
    "        c1 = F.max_pool2d(c1, kernel_size=3, stride=2, padding=1)\n",
    "        c2 = self.layer1(c1)\n",
    "        c3 = self.layer2(c2)\n",
    "        c4 = self.layer3(c3)\n",
    "        c5 = self.layer4(c4)\n",
    "        p6 = self.conv6(c5)\n",
    "        p7 = self.conv7(F.relu(p6))\n",
    "        # Top-down\n",
    "        p5 = self.latlayer1(c5)\n",
    "        p4 = self._upsample_add(p5, self.latlayer2(c4))\n",
    "        p4 = self.toplayer1(p4)\n",
    "        p3 = self._upsample_add(p4, self.latlayer3(c3))\n",
    "        p3 = self.toplayer2(p3)\n",
    "        return p3, p4, p5, p6, p7\n",
    "\n",
    "\n",
    "def FPN50():\n",
    "    return FPN(Bottleneck, [3,4,6,3])\n",
    "\n",
    "def FPN101():\n",
    "    return FPN(Bottleneck, [2,4,23,3])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "class RetinaNet(nn.Module):\n",
    "    num_anchors = 9\n",
    "    \n",
    "    def __init__(self, num_classes=20):\n",
    "        super(RetinaNet, self).__init__()\n",
    "        self.fpn = FPN50()\n",
    "        self.num_classes = num_classes\n",
    "        self.loc_head = self._make_head(self.num_anchors*4)\n",
    "        self.cls_head = self._make_head(self.num_anchors*self.num_classes)\n",
    "\n",
    "    def forward(self, x):\n",
    "        fms = self.fpn(x)\n",
    "        '''  fms的结果\n",
    "        torch.Size([1, 256, 28, 28])\n",
    "        torch.Size([1, 256, 14, 14])\n",
    "        torch.Size([1, 256, 7, 7])\n",
    "        torch.Size([1, 256, 4, 4])\n",
    "        torch.Size([1, 256, 2, 2])\n",
    "        '''\n",
    "        loc_preds = []\n",
    "        cls_preds = []\n",
    "        print('len fms = ', len(fms))\n",
    "        for fm in fms:\n",
    "            loc_pred = self.loc_head(fm)\n",
    "            cls_pred = self.cls_head(fm)\n",
    "            loc_pred = loc_pred.permute(0,2,3,1).contiguous().view(x.size(0),-1,4)                 # [N, 9*4,H,W] -> [N,H,W, 9*4] -> [N,H*W*9, 4]\n",
    "            cls_pred = cls_pred.permute(0,2,3,1).contiguous().view(x.size(0),-1,self.num_classes)  # [N,9*20,H,W] -> [N,H,W,9*20] -> [N,H*W*9,20]\n",
    "            loc_preds.append(loc_pred)\n",
    "            cls_preds.append(cls_pred)\n",
    "            #           [1, 9441, 4]            [1, 9441, 20]\n",
    "        return torch.cat(loc_preds,1), torch.cat(cls_preds,1)\n",
    "\n",
    "    def _make_head(self, out_planes):\n",
    "        layers = []\n",
    "        for _ in range(4):\n",
    "            layers.append(nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1))\n",
    "            layers.append(nn.ReLU(True))\n",
    "        layers.append(nn.Conv2d(256, out_planes, kernel_size=3, stride=1, padding=1))\n",
    "        return nn.Sequential(*layers)\n",
    "\n",
    "    def freeze_bn(self):\n",
    "        '''Freeze BatchNorm layers.'''\n",
    "        for layer in self.modules():\n",
    "            if isinstance(layer, nn.BatchNorm2d):\n",
    "                layer.eval()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "oOYAHVvRi4d_"
   },
   "source": [
    "### 主模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "3REx-13Ai4d_"
   },
   "outputs": [],
   "source": [
    "class Net(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Net,self).__init__()\n",
    "        self.features = nn.Sequential(\n",
    "            nn.Conv2d(3, 3, 3,  padding=1)\n",
    "        )\n",
    "        \n",
    "        self.conv1 = nn.Conv2d(3,6,5)\n",
    "        self.pool = nn.MaxPool2d(2,2)\n",
    "        self.conv2 = nn.Conv2d(6,16,5)\n",
    "        self.fc1 = nn.Linear(16 * 18 * 18,800)\n",
    "        self.fc2 = nn.Linear(800,120)\n",
    "        self.fc3 = nn.Linear(120,2)\n",
    "        self.conv3 = D3_Conv((3, 3, 3))\n",
    "        \n",
    "        self.ca = ChannelAttention(16)\n",
    "        self.sq = SpatialAttention()\n",
    "        \n",
    "    def forward(self,x):\n",
    "        x = self.conv3(x)\n",
    "        x = self.features(x)\n",
    "        x = self.sq(x) * x\n",
    "        x = self.pool(F.relu(self.conv1(x)))\n",
    "        x = self.pool(F.relu(self.conv2(x)))\n",
    "        x = x * self.ca(x)\n",
    "        x = x.view(-1,16 * 18 * 18)\n",
    "        x = F.relu(self.fc1(x))\n",
    "        x = F.relu(self.fc2(x))\n",
    "        x = self.fc3(x)\n",
    "        \n",
    "        return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "collapsed": true,
    "id": "1JPyUh_ti4eB",
    "outputId": "71f231bd-66ca-4cd9-891e-1f8869d8dc2e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0  --->  ('', Net(\n",
      "  (features): Sequential(\n",
      "    (0): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  )\n",
      "  (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))\n",
      "  (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n",
      "  (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))\n",
      "  (fc1): Linear(in_features=5184, out_features=800, bias=True)\n",
      "  (fc2): Linear(in_features=800, out_features=120, bias=True)\n",
      "  (fc3): Linear(in_features=120, out_features=10, bias=True)\n",
      "  (ca): ChannelAttention(\n",
      "    (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "    (max_pool): AdaptiveMaxPool2d(output_size=1)\n",
      "    (fc1): Conv2d(16, 1, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "    (relu1): ReLU()\n",
      "    (fc2): Conv2d(1, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "    (sigmoid): Sigmoid()\n",
      "  )\n",
      "  (sq): SpatialAttention(\n",
      "    (conv1): Conv2d(2, 1, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), bias=False)\n",
      "    (sigmoid): Sigmoid()\n",
      "  )\n",
      "))\n",
      "1  --->  ('features', Sequential(\n",
      "  (0): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "))\n",
      "2  --->  ('features.0', Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))\n",
      "3  --->  ('conv1', Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1)))\n",
      "4  --->  ('pool', MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False))\n",
      "5  --->  ('conv2', Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1)))\n",
      "6  --->  ('fc1', Linear(in_features=5184, out_features=800, bias=True))\n",
      "7  --->  ('fc2', Linear(in_features=800, out_features=120, bias=True))\n",
      "8  --->  ('fc3', Linear(in_features=120, out_features=10, bias=True))\n",
      "9  --->  ('ca', ChannelAttention(\n",
      "  (avg_pool): AdaptiveAvgPool2d(output_size=1)\n",
      "  (max_pool): AdaptiveMaxPool2d(output_size=1)\n",
      "  (fc1): Conv2d(16, 1, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "  (relu1): ReLU()\n",
      "  (fc2): Conv2d(1, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "  (sigmoid): Sigmoid()\n",
      "))\n",
      "10  --->  ('ca.avg_pool', AdaptiveAvgPool2d(output_size=1))\n",
      "11  --->  ('ca.max_pool', AdaptiveMaxPool2d(output_size=1))\n",
      "12  --->  ('ca.fc1', Conv2d(16, 1, kernel_size=(1, 1), stride=(1, 1), bias=False))\n",
      "13  --->  ('ca.relu1', ReLU())\n",
      "14  --->  ('ca.fc2', Conv2d(1, 16, kernel_size=(1, 1), stride=(1, 1), bias=False))\n",
      "15  --->  ('ca.sigmoid', Sigmoid())\n",
      "16  --->  ('sq', SpatialAttention(\n",
      "  (conv1): Conv2d(2, 1, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), bias=False)\n",
      "  (sigmoid): Sigmoid()\n",
      "))\n",
      "17  --->  ('sq.conv1', Conv2d(2, 1, kernel_size=(7, 7), stride=(1, 1), padding=(3, 3), bias=False))\n",
      "18  --->  ('sq.sigmoid', Sigmoid())\n"
     ]
    }
   ],
   "source": [
    "for idx, m in enumerate(net.named_modules()):\n",
    "    print(idx, ' ---> ', m)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "FyZ9RV_Fi4eD"
   },
   "source": [
    "## 模型保存"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 413
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 821,
     "status": "ok",
     "timestamp": 1578041448565,
     "user": {
      "displayName": "宏沉一笑",
      "photoUrl": "",
      "userId": "12018462559157601606"
     },
     "user_tz": -480
    },
    "id": "ZAfQxrfSi4eE",
    "outputId": "7fe473b9-dcea-4244-b95b-be66b0c4495d"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "E:\\Soft\\anaconda\\envs\\retinanet\\lib\\site-packages\\torch\\serialization.py:256: UserWarning: Couldn't retrieve source code for container of type Net. It won't be checked for correctness upon loading.\n",
      "  \"type \" + obj.__name__ + \". It won't be checked \"\n",
      "E:\\Soft\\anaconda\\envs\\retinanet\\lib\\site-packages\\torch\\serialization.py:256: UserWarning: Couldn't retrieve source code for container of type ChannelAttention. It won't be checked for correctness upon loading.\n",
      "  \"type \" + obj.__name__ + \". It won't be checked \"\n",
      "E:\\Soft\\anaconda\\envs\\retinanet\\lib\\site-packages\\torch\\serialization.py:256: UserWarning: Couldn't retrieve source code for container of type SpatialAttention. It won't be checked for correctness upon loading.\n",
      "  \"type \" + obj.__name__ + \". It won't be checked \"\n"
     ]
    }
   ],
   "source": [
    "# 保存模型与结构\n",
    "torch.save(net, \"tmp//torch_model.pth\")\n",
    "\n",
    "# 保存模型权重\n",
    "# torch.save(net.state_dict(), 'tmp//torch_dict.pkl')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "BRvVFe7qi4eG"
   },
   "source": [
    "\n",
    "## 模型导入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "YMrxPmPUi4eG"
   },
   "outputs": [],
   "source": [
    "# 导入模型权重与结构\n",
    "model = torch.load(\"tmp//torch_model.pth\")\n",
    "\n",
    "# 导入模型权重\n",
    "# net.load_state_dict(torch.load('torch_dict.pkl'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "collapsed": true,
    "id": "qTZgs9AZoWok",
    "outputId": "53eb053d-1d9a-4db2-f617-9b22030a44cd"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on Net in module __main__ object:\n",
      "\n",
      "class Net(torch.nn.modules.module.Module)\n",
      " |  Base class for all neural network modules.\n",
      " |  \n",
      " |  Your models should also subclass this class.\n",
      " |  \n",
      " |  Modules can also contain other Modules, allowing to nest them in\n",
      " |  a tree structure. You can assign the submodules as regular attributes::\n",
      " |  \n",
      " |      import torch.nn as nn\n",
      " |      import torch.nn.functional as F\n",
      " |  \n",
      " |      class Model(nn.Module):\n",
      " |          def __init__(self):\n",
      " |              super(Model, self).__init__()\n",
      " |              self.conv1 = nn.Conv2d(1, 20, 5)\n",
      " |              self.conv2 = nn.Conv2d(20, 20, 5)\n",
      " |  \n",
      " |          def forward(self, x):\n",
      " |              x = F.relu(self.conv1(x))\n",
      " |              return F.relu(self.conv2(x))\n",
      " |  \n",
      " |  Submodules assigned in this way will be registered, and will have their\n",
      " |  parameters converted too when you call :meth:`to`, etc.\n",
      " |  \n",
      " |  Method resolution order:\n",
      " |      Net\n",
      " |      torch.nn.modules.module.Module\n",
      " |      builtins.object\n",
      " |  \n",
      " |  Methods defined here:\n",
      " |  \n",
      " |  __init__(self)\n",
      " |      Initialize self.  See help(type(self)) for accurate signature.\n",
      " |  \n",
      " |  forward(self, x)\n",
      " |      Defines the computation performed at every call.\n",
      " |      \n",
      " |      Should be overridden by all subclasses.\n",
      " |      \n",
      " |      .. note::\n",
      " |          Although the recipe for forward pass needs to be defined within\n",
      " |          this function, one should call the :class:`Module` instance afterwards\n",
      " |          instead of this since the former takes care of running the\n",
      " |          registered hooks while the latter silently ignores them.\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data and other attributes defined here:\n",
      " |  \n",
      " |  __slotnames__ = []\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Methods inherited from torch.nn.modules.module.Module:\n",
      " |  \n",
      " |  __call__(self, *input, **kwargs)\n",
      " |      Call self as a function.\n",
      " |  \n",
      " |  __delattr__(self, name)\n",
      " |      Implement delattr(self, name).\n",
      " |  \n",
      " |  __dir__(self)\n",
      " |      Default dir() implementation.\n",
      " |  \n",
      " |  __getattr__(self, name)\n",
      " |  \n",
      " |  __repr__(self)\n",
      " |      Return repr(self).\n",
      " |  \n",
      " |  __setattr__(self, name, value)\n",
      " |      Implement setattr(self, name, value).\n",
      " |  \n",
      " |  __setstate__(self, state)\n",
      " |  \n",
      " |  add_module(self, name, module)\n",
      " |      Adds a child module to the current module.\n",
      " |      \n",
      " |      The module can be accessed as an attribute using the given name.\n",
      " |      \n",
      " |      Args:\n",
      " |          name (string): name of the child module. The child module can be\n",
      " |              accessed from this module using the given name\n",
      " |          module (Module): child module to be added to the module.\n",
      " |  \n",
      " |  apply(self, fn)\n",
      " |      Applies ``fn`` recursively to every submodule (as returned by ``.children()``)\n",
      " |      as well as self. Typical use includes initializing the parameters of a model\n",
      " |      (see also :ref:`torch-nn-init`).\n",
      " |      \n",
      " |      Args:\n",
      " |          fn (:class:`Module` -> None): function to be applied to each submodule\n",
      " |      \n",
      " |      Returns:\n",
      " |          Module: self\n",
      " |      \n",
      " |      Example::\n",
      " |      \n",
      " |          >>> def init_weights(m):\n",
      " |          >>>     print(m)\n",
      " |          >>>     if type(m) == nn.Linear:\n",
      " |          >>>         m.weight.data.fill_(1.0)\n",
      " |          >>>         print(m.weight)\n",
      " |          >>> net = nn.Sequential(nn.Linear(2, 2), nn.Linear(2, 2))\n",
      " |          >>> net.apply(init_weights)\n",
      " |          Linear(in_features=2, out_features=2, bias=True)\n",
      " |          Parameter containing:\n",
      " |          tensor([[ 1.,  1.],\n",
      " |                  [ 1.,  1.]])\n",
      " |          Linear(in_features=2, out_features=2, bias=True)\n",
      " |          Parameter containing:\n",
      " |          tensor([[ 1.,  1.],\n",
      " |                  [ 1.,  1.]])\n",
      " |          Sequential(\n",
      " |            (0): Linear(in_features=2, out_features=2, bias=True)\n",
      " |            (1): Linear(in_features=2, out_features=2, bias=True)\n",
      " |          )\n",
      " |          Sequential(\n",
      " |            (0): Linear(in_features=2, out_features=2, bias=True)\n",
      " |            (1): Linear(in_features=2, out_features=2, bias=True)\n",
      " |          )\n",
      " |  \n",
      " |  buffers(self, recurse=True)\n",
      " |      Returns an iterator over module buffers.\n",
      " |      \n",
      " |      Args:\n",
      " |          recurse (bool): if True, then yields buffers of this module\n",
      " |              and all submodules. Otherwise, yields only buffers that\n",
      " |              are direct members of this module.\n",
      " |      \n",
      " |      Yields:\n",
      " |          torch.Tensor: module buffer\n",
      " |      \n",
      " |      Example::\n",
      " |      \n",
      " |          >>> for buf in model.buffers():\n",
      " |          >>>     print(type(buf.data), buf.size())\n",
      " |          <class 'torch.FloatTensor'> (20L,)\n",
      " |          <class 'torch.FloatTensor'> (20L, 1L, 5L, 5L)\n",
      " |  \n",
      " |  children(self)\n",
      " |      Returns an iterator over immediate children modules.\n",
      " |      \n",
      " |      Yields:\n",
      " |          Module: a child module\n",
      " |  \n",
      " |  cpu(self)\n",
      " |      Moves all model parameters and buffers to the CPU.\n",
      " |      \n",
      " |      Returns:\n",
      " |          Module: self\n",
      " |  \n",
      " |  cuda(self, device=None)\n",
      " |      Moves all model parameters and buffers to the GPU.\n",
      " |      \n",
      " |      This also makes associated parameters and buffers different objects. So\n",
      " |      it should be called before constructing optimizer if the module will\n",
      " |      live on GPU while being optimized.\n",
      " |      \n",
      " |      Arguments:\n",
      " |          device (int, optional): if specified, all parameters will be\n",
      " |              copied to that device\n",
      " |      \n",
      " |      Returns:\n",
      " |          Module: self\n",
      " |  \n",
      " |  double(self)\n",
      " |      Casts all floating point parameters and buffers to ``double`` datatype.\n",
      " |      \n",
      " |      Returns:\n",
      " |          Module: self\n",
      " |  \n",
      " |  eval(self)\n",
      " |      Sets the module in evaluation mode.\n",
      " |      \n",
      " |      This has any effect only on certain modules. See documentations of\n",
      " |      particular modules for details of their behaviors in training/evaluation\n",
      " |      mode, if they are affected, e.g. :class:`Dropout`, :class:`BatchNorm`,\n",
      " |      etc.\n",
      " |      \n",
      " |      This is equivalent with :meth:`self.train(False) <torch.nn.Module.train>`.\n",
      " |      \n",
      " |      Returns:\n",
      " |          Module: self\n",
      " |  \n",
      " |  extra_repr(self)\n",
      " |      Set the extra representation of the module\n",
      " |      \n",
      " |      To print customized extra information, you should reimplement\n",
      " |      this method in your own modules. Both single-line and multi-line\n",
      " |      strings are acceptable.\n",
      " |  \n",
      " |  float(self)\n",
      " |      Casts all floating point parameters and buffers to float datatype.\n",
      " |      \n",
      " |      Returns:\n",
      " |          Module: self\n",
      " |  \n",
      " |  half(self)\n",
      " |      Casts all floating point parameters and buffers to ``half`` datatype.\n",
      " |      \n",
      " |      Returns:\n",
      " |          Module: self\n",
      " |  \n",
      " |  load_state_dict(self, state_dict, strict=True)\n",
      " |      Copies parameters and buffers from :attr:`state_dict` into\n",
      " |      this module and its descendants. If :attr:`strict` is ``True``, then\n",
      " |      the keys of :attr:`state_dict` must exactly match the keys returned\n",
      " |      by this module's :meth:`~torch.nn.Module.state_dict` function.\n",
      " |      \n",
      " |      Arguments:\n",
      " |          state_dict (dict): a dict containing parameters and\n",
      " |              persistent buffers.\n",
      " |          strict (bool, optional): whether to strictly enforce that the keys\n",
      " |              in :attr:`state_dict` match the keys returned by this module's\n",
      " |              :meth:`~torch.nn.Module.state_dict` function. Default: ``True``\n",
      " |      \n",
      " |      Returns:\n",
      " |          ``NamedTuple`` with ``missing_keys`` and ``unexpected_keys`` fields:\n",
      " |              * **missing_keys** is a list of str containing the missing keys\n",
      " |              * **unexpected_keys** is a list of str containing the unexpected keys\n",
      " |  \n",
      " |  modules(self)\n",
      " |      Returns an iterator over all modules in the network.\n",
      " |      \n",
      " |      Yields:\n",
      " |          Module: a module in the network\n",
      " |      \n",
      " |      Note:\n",
      " |          Duplicate modules are returned only once. In the following\n",
      " |          example, ``l`` will be returned only once.\n",
      " |      \n",
      " |      Example::\n",
      " |      \n",
      " |          >>> l = nn.Linear(2, 2)\n",
      " |          >>> net = nn.Sequential(l, l)\n",
      " |          >>> for idx, m in enumerate(net.modules()):\n",
      " |                  print(idx, '->', m)\n",
      " |      \n",
      " |          0 -> Sequential(\n",
      " |            (0): Linear(in_features=2, out_features=2, bias=True)\n",
      " |            (1): Linear(in_features=2, out_features=2, bias=True)\n",
      " |          )\n",
      " |          1 -> Linear(in_features=2, out_features=2, bias=True)\n",
      " |  \n",
      " |  named_buffers(self, prefix='', recurse=True)\n",
      " |      Returns an iterator over module buffers, yielding both the\n",
      " |      name of the buffer as well as the buffer itself.\n",
      " |      \n",
      " |      Args:\n",
      " |          prefix (str): prefix to prepend to all buffer names.\n",
      " |          recurse (bool): if True, then yields buffers of this module\n",
      " |              and all submodules. Otherwise, yields only buffers that\n",
      " |              are direct members of this module.\n",
      " |      \n",
      " |      Yields:\n",
      " |          (string, torch.Tensor): Tuple containing the name and buffer\n",
      " |      \n",
      " |      Example::\n",
      " |      \n",
      " |          >>> for name, buf in self.named_buffers():\n",
      " |          >>>    if name in ['running_var']:\n",
      " |          >>>        print(buf.size())\n",
      " |  \n",
      " |  named_children(self)\n",
      " |      Returns an iterator over immediate children modules, yielding both\n",
      " |      the name of the module as well as the module itself.\n",
      " |      \n",
      " |      Yields:\n",
      " |          (string, Module): Tuple containing a name and child module\n",
      " |      \n",
      " |      Example::\n",
      " |      \n",
      " |          >>> for name, module in model.named_children():\n",
      " |          >>>     if name in ['conv4', 'conv5']:\n",
      " |          >>>         print(module)\n",
      " |  \n",
      " |  named_modules(self, memo=None, prefix='')\n",
      " |      Returns an iterator over all modules in the network, yielding\n",
      " |      both the name of the module as well as the module itself.\n",
      " |      \n",
      " |      Yields:\n",
      " |          (string, Module): Tuple of name and module\n",
      " |      \n",
      " |      Note:\n",
      " |          Duplicate modules are returned only once. In the following\n",
      " |          example, ``l`` will be returned only once.\n",
      " |      \n",
      " |      Example::\n",
      " |      \n",
      " |          >>> l = nn.Linear(2, 2)\n",
      " |          >>> net = nn.Sequential(l, l)\n",
      " |          >>> for idx, m in enumerate(net.named_modules()):\n",
      " |                  print(idx, '->', m)\n",
      " |      \n",
      " |          0 -> ('', Sequential(\n",
      " |            (0): Linear(in_features=2, out_features=2, bias=True)\n",
      " |            (1): Linear(in_features=2, out_features=2, bias=True)\n",
      " |          ))\n",
      " |          1 -> ('0', Linear(in_features=2, out_features=2, bias=True))\n",
      " |  \n",
      " |  named_parameters(self, prefix='', recurse=True)\n",
      " |      Returns an iterator over module parameters, yielding both the\n",
      " |      name of the parameter as well as the parameter itself.\n",
      " |      \n",
      " |      Args:\n",
      " |          prefix (str): prefix to prepend to all parameter names.\n",
      " |          recurse (bool): if True, then yields parameters of this module\n",
      " |              and all submodules. Otherwise, yields only parameters that\n",
      " |              are direct members of this module.\n",
      " |      \n",
      " |      Yields:\n",
      " |          (string, Parameter): Tuple containing the name and parameter\n",
      " |      \n",
      " |      Example::\n",
      " |      \n",
      " |          >>> for name, param in self.named_parameters():\n",
      " |          >>>    if name in ['bias']:\n",
      " |          >>>        print(param.size())\n",
      " |  \n",
      " |  parameters(self, recurse=True)\n",
      " |      Returns an iterator over module parameters.\n",
      " |      \n",
      " |      This is typically passed to an optimizer.\n",
      " |      \n",
      " |      Args:\n",
      " |          recurse (bool): if True, then yields parameters of this module\n",
      " |              and all submodules. Otherwise, yields only parameters that\n",
      " |              are direct members of this module.\n",
      " |      \n",
      " |      Yields:\n",
      " |          Parameter: module parameter\n",
      " |      \n",
      " |      Example::\n",
      " |      \n",
      " |          >>> for param in model.parameters():\n",
      " |          >>>     print(type(param.data), param.size())\n",
      " |          <class 'torch.FloatTensor'> (20L,)\n",
      " |          <class 'torch.FloatTensor'> (20L, 1L, 5L, 5L)\n",
      " |  \n",
      " |  register_backward_hook(self, hook)\n",
      " |      Registers a backward hook on the module.\n",
      " |      \n",
      " |      The hook will be called every time the gradients with respect to module\n",
      " |      inputs are computed. The hook should have the following signature::\n",
      " |      \n",
      " |          hook(module, grad_input, grad_output) -> Tensor or None\n",
      " |      \n",
      " |      The :attr:`grad_input` and :attr:`grad_output` may be tuples if the\n",
      " |      module has multiple inputs or outputs. The hook should not modify its\n",
      " |      arguments, but it can optionally return a new gradient with respect to\n",
      " |      input that will be used in place of :attr:`grad_input` in subsequent\n",
      " |      computations.\n",
      " |      \n",
      " |      Returns:\n",
      " |          :class:`torch.utils.hooks.RemovableHandle`:\n",
      " |              a handle that can be used to remove the added hook by calling\n",
      " |              ``handle.remove()``\n",
      " |      \n",
      " |      .. warning ::\n",
      " |      \n",
      " |          The current implementation will not have the presented behavior\n",
      " |          for complex :class:`Module` that perform many operations.\n",
      " |          In some failure cases, :attr:`grad_input` and :attr:`grad_output` will only\n",
      " |          contain the gradients for a subset of the inputs and outputs.\n",
      " |          For such :class:`Module`, you should use :func:`torch.Tensor.register_hook`\n",
      " |          directly on a specific input or output to get the required gradients.\n",
      " |  \n",
      " |  register_buffer(self, name, tensor)\n",
      " |      Adds a persistent buffer to the module.\n",
      " |      \n",
      " |      This is typically used to register a buffer that should not to be\n",
      " |      considered a model parameter. For example, BatchNorm's ``running_mean``\n",
      " |      is not a parameter, but is part of the persistent state.\n",
      " |      \n",
      " |      Buffers can be accessed as attributes using given names.\n",
      " |      \n",
      " |      Args:\n",
      " |          name (string): name of the buffer. The buffer can be accessed\n",
      " |              from this module using the given name\n",
      " |          tensor (Tensor): buffer to be registered.\n",
      " |      \n",
      " |      Example::\n",
      " |      \n",
      " |          >>> self.register_buffer('running_mean', torch.zeros(num_features))\n",
      " |  \n",
      " |  register_forward_hook(self, hook)\n",
      " |      Registers a forward hook on the module.\n",
      " |      \n",
      " |      The hook will be called every time after :func:`forward` has computed an output.\n",
      " |      It should have the following signature::\n",
      " |      \n",
      " |          hook(module, input, output) -> None or modified output\n",
      " |      \n",
      " |      The hook can modify the output. It can modify the input inplace but\n",
      " |      it will not have effect on forward since this is called after\n",
      " |      :func:`forward` is called.\n",
      " |      \n",
      " |      Returns:\n",
      " |          :class:`torch.utils.hooks.RemovableHandle`:\n",
      " |              a handle that can be used to remove the added hook by calling\n",
      " |              ``handle.remove()``\n",
      " |  \n",
      " |  register_forward_pre_hook(self, hook)\n",
      " |      Registers a forward pre-hook on the module.\n",
      " |      \n",
      " |      The hook will be called every time before :func:`forward` is invoked.\n",
      " |      It should have the following signature::\n",
      " |      \n",
      " |          hook(module, input) -> None or modified input\n",
      " |      \n",
      " |      The hook can modify the input. User can either return a tuple or a\n",
      " |      single modified value in the hook. We will wrap the value into a tuple\n",
      " |      if a single value is returned(unless that value is already a tuple).\n",
      " |      \n",
      " |      Returns:\n",
      " |          :class:`torch.utils.hooks.RemovableHandle`:\n",
      " |              a handle that can be used to remove the added hook by calling\n",
      " |              ``handle.remove()``\n",
      " |  \n",
      " |  register_parameter(self, name, param)\n",
      " |      Adds a parameter to the module.\n",
      " |      \n",
      " |      The parameter can be accessed as an attribute using given name.\n",
      " |      \n",
      " |      Args:\n",
      " |          name (string): name of the parameter. The parameter can be accessed\n",
      " |              from this module using the given name\n",
      " |          param (Parameter): parameter to be added to the module.\n",
      " |  \n",
      " |  requires_grad_(self, requires_grad=True)\n",
      " |      Change if autograd should record operations on parameters in this\n",
      " |      module.\n",
      " |      \n",
      " |      This method sets the parameters' :attr:`requires_grad` attributes\n",
      " |      in-place.\n",
      " |      \n",
      " |      This method is helpful for freezing part of the module for finetuning\n",
      " |      or training parts of a model individually (e.g., GAN training).\n",
      " |      \n",
      " |      Args:\n",
      " |          requires_grad (bool): whether autograd should record operations on\n",
      " |                                parameters in this module. Default: ``True``.\n",
      " |      \n",
      " |      Returns:\n",
      " |          Module: self\n",
      " |  \n",
      " |  share_memory(self)\n",
      " |  \n",
      " |  state_dict(self, destination=None, prefix='', keep_vars=False)\n",
      " |      Returns a dictionary containing a whole state of the module.\n",
      " |      \n",
      " |      Both parameters and persistent buffers (e.g. running averages) are\n",
      " |      included. Keys are corresponding parameter and buffer names.\n",
      " |      \n",
      " |      Returns:\n",
      " |          dict:\n",
      " |              a dictionary containing a whole state of the module\n",
      " |      \n",
      " |      Example::\n",
      " |      \n",
      " |          >>> module.state_dict().keys()\n",
      " |          ['bias', 'weight']\n",
      " |  \n",
      " |  to(self, *args, **kwargs)\n",
      " |      Moves and/or casts the parameters and buffers.\n",
      " |      \n",
      " |      This can be called as\n",
      " |      \n",
      " |      .. function:: to(device=None, dtype=None, non_blocking=False)\n",
      " |      \n",
      " |      .. function:: to(dtype, non_blocking=False)\n",
      " |      \n",
      " |      .. function:: to(tensor, non_blocking=False)\n",
      " |      \n",
      " |      Its signature is similar to :meth:`torch.Tensor.to`, but only accepts\n",
      " |      floating point desired :attr:`dtype` s. In addition, this method will\n",
      " |      only cast the floating point parameters and buffers to :attr:`dtype`\n",
      " |      (if given). The integral parameters and buffers will be moved\n",
      " |      :attr:`device`, if that is given, but with dtypes unchanged. When\n",
      " |      :attr:`non_blocking` is set, it tries to convert/move asynchronously\n",
      " |      with respect to the host if possible, e.g., moving CPU Tensors with\n",
      " |      pinned memory to CUDA devices.\n",
      " |      \n",
      " |      See below for examples.\n",
      " |      \n",
      " |      .. note::\n",
      " |          This method modifies the module in-place.\n",
      " |      \n",
      " |      Args:\n",
      " |          device (:class:`torch.device`): the desired device of the parameters\n",
      " |              and buffers in this module\n",
      " |          dtype (:class:`torch.dtype`): the desired floating point type of\n",
      " |              the floating point parameters and buffers in this module\n",
      " |          tensor (torch.Tensor): Tensor whose dtype and device are the desired\n",
      " |              dtype and device for all parameters and buffers in this module\n",
      " |      \n",
      " |      Returns:\n",
      " |          Module: self\n",
      " |      \n",
      " |      Example::\n",
      " |      \n",
      " |          >>> linear = nn.Linear(2, 2)\n",
      " |          >>> linear.weight\n",
      " |          Parameter containing:\n",
      " |          tensor([[ 0.1913, -0.3420],\n",
      " |                  [-0.5113, -0.2325]])\n",
      " |          >>> linear.to(torch.double)\n",
      " |          Linear(in_features=2, out_features=2, bias=True)\n",
      " |          >>> linear.weight\n",
      " |          Parameter containing:\n",
      " |          tensor([[ 0.1913, -0.3420],\n",
      " |                  [-0.5113, -0.2325]], dtype=torch.float64)\n",
      " |          >>> gpu1 = torch.device(\"cuda:1\")\n",
      " |          >>> linear.to(gpu1, dtype=torch.half, non_blocking=True)\n",
      " |          Linear(in_features=2, out_features=2, bias=True)\n",
      " |          >>> linear.weight\n",
      " |          Parameter containing:\n",
      " |          tensor([[ 0.1914, -0.3420],\n",
      " |                  [-0.5112, -0.2324]], dtype=torch.float16, device='cuda:1')\n",
      " |          >>> cpu = torch.device(\"cpu\")\n",
      " |          >>> linear.to(cpu)\n",
      " |          Linear(in_features=2, out_features=2, bias=True)\n",
      " |          >>> linear.weight\n",
      " |          Parameter containing:\n",
      " |          tensor([[ 0.1914, -0.3420],\n",
      " |                  [-0.5112, -0.2324]], dtype=torch.float16)\n",
      " |  \n",
      " |  train(self, mode=True)\n",
      " |      Sets the module in training mode.\n",
      " |      \n",
      " |      This has any effect only on certain modules. See documentations of\n",
      " |      particular modules for details of their behaviors in training/evaluation\n",
      " |      mode, if they are affected, e.g. :class:`Dropout`, :class:`BatchNorm`,\n",
      " |      etc.\n",
      " |      \n",
      " |      Args:\n",
      " |          mode (bool): whether to set training mode (``True``) or evaluation\n",
      " |                       mode (``False``). Default: ``True``.\n",
      " |      \n",
      " |      Returns:\n",
      " |          Module: self\n",
      " |  \n",
      " |  type(self, dst_type)\n",
      " |      Casts all parameters and buffers to :attr:`dst_type`.\n",
      " |      \n",
      " |      Arguments:\n",
      " |          dst_type (type or string): the desired type\n",
      " |      \n",
      " |      Returns:\n",
      " |          Module: self\n",
      " |  \n",
      " |  zero_grad(self)\n",
      " |      Sets gradients of all model parameters to zero.\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data descriptors inherited from torch.nn.modules.module.Module:\n",
      " |  \n",
      " |  __dict__\n",
      " |      dictionary for instance variables (if defined)\n",
      " |  \n",
      " |  __weakref__\n",
      " |      list of weak references to the object (if defined)\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data and other attributes inherited from torch.nn.modules.module.Module:\n",
      " |  \n",
      " |  dump_patches = False\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "ZfOAs-3NoWol",
    "outputId": "5d3a9622-ba54-41e4-81fa-d8cf83b0e70b",
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([-0.0946,  0.0856,  0.0092,  0.0557,  0.0731,  0.0672], device='cuda:0')"
      ]
     },
     "execution_count": 64,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.state_dict()['conv1.bias']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "HJ3-Lf2Li4eI"
   },
   "source": [
    "## 模型查看"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 1440,
     "status": "ok",
     "timestamp": 1578537114183,
     "user": {
      "displayName": "宏沉一笑",
      "photoUrl": "",
      "userId": "12018462559157601606"
     },
     "user_tz": -480
    },
    "id": "AGNFeINJi4eJ",
    "outputId": "4c6a5d9b-638f-49c3-e977-d780fae654b2",
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ResNet(\n",
      "  (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n",
      "  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "  (relu): ReLU(inplace=True)\n",
      "  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n",
      "  (layer1): Sequential(\n",
      "    (0): Bottleneck(\n",
      "      (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "    )\n",
      "    (1): Bottleneck(\n",
      "      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (2): Bottleneck(\n",
      "      (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "  )\n",
      "  (layer2): Sequential(\n",
      "    (0): Bottleneck(\n",
      "      (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "    )\n",
      "    (1): Bottleneck(\n",
      "      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (2): Bottleneck(\n",
      "      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (3): Bottleneck(\n",
      "      (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "  )\n",
      "  (layer3): Sequential(\n",
      "    (0): Bottleneck(\n",
      "      (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "    )\n",
      "    (1): Bottleneck(\n",
      "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (2): Bottleneck(\n",
      "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (3): Bottleneck(\n",
      "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (4): Bottleneck(\n",
      "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (5): Bottleneck(\n",
      "      (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "  )\n",
      "  (layer4): Sequential(\n",
      "    (0): Bottleneck(\n",
      "      (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "    )\n",
      "    (1): Bottleneck(\n",
      "      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "    (2): Bottleneck(\n",
      "      (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n",
      "      (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "    )\n",
      "  )\n",
      "  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "  (fc): Linear(in_features=2048, out_features=1000, bias=True)\n",
      ")\n",
      "\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "====================================================================================================\n",
      "                                             Kernel Shape       Output Shape  \\\n",
      "Layer                                                                          \n",
      "0_conv1                                     [3, 64, 7, 7]  [4, 64, 112, 112]   \n",
      "1_bn1                                                [64]  [4, 64, 112, 112]   \n",
      "2_relu                                                  -  [4, 64, 112, 112]   \n",
      "3_maxpool                                               -    [4, 64, 56, 56]   \n",
      "4_layer1.0.Conv2d_conv1                    [64, 64, 1, 1]    [4, 64, 56, 56]   \n",
      "5_layer1.0.BatchNorm2d_bn1                           [64]    [4, 64, 56, 56]   \n",
      "6_layer1.0.ReLU_relu                                    -    [4, 64, 56, 56]   \n",
      "7_layer1.0.Conv2d_conv2                    [64, 64, 3, 3]    [4, 64, 56, 56]   \n",
      "8_layer1.0.BatchNorm2d_bn2                           [64]    [4, 64, 56, 56]   \n",
      "9_layer1.0.ReLU_relu                                    -    [4, 64, 56, 56]   \n",
      "10_layer1.0.Conv2d_conv3                  [64, 256, 1, 1]   [4, 256, 56, 56]   \n",
      "11_layer1.0.BatchNorm2d_bn3                         [256]   [4, 256, 56, 56]   \n",
      "12_layer1.0.downsample.Conv2d_0           [64, 256, 1, 1]   [4, 256, 56, 56]   \n",
      "13_layer1.0.downsample.BatchNorm2d_1                [256]   [4, 256, 56, 56]   \n",
      "14_layer1.0.ReLU_relu                                   -   [4, 256, 56, 56]   \n",
      "15_layer1.1.Conv2d_conv1                  [256, 64, 1, 1]    [4, 64, 56, 56]   \n",
      "16_layer1.1.BatchNorm2d_bn1                          [64]    [4, 64, 56, 56]   \n",
      "17_layer1.1.ReLU_relu                                   -    [4, 64, 56, 56]   \n",
      "18_layer1.1.Conv2d_conv2                   [64, 64, 3, 3]    [4, 64, 56, 56]   \n",
      "19_layer1.1.BatchNorm2d_bn2                          [64]    [4, 64, 56, 56]   \n",
      "20_layer1.1.ReLU_relu                                   -    [4, 64, 56, 56]   \n",
      "21_layer1.1.Conv2d_conv3                  [64, 256, 1, 1]   [4, 256, 56, 56]   \n",
      "22_layer1.1.BatchNorm2d_bn3                         [256]   [4, 256, 56, 56]   \n",
      "23_layer1.1.ReLU_relu                                   -   [4, 256, 56, 56]   \n",
      "24_layer1.2.Conv2d_conv1                  [256, 64, 1, 1]    [4, 64, 56, 56]   \n",
      "25_layer1.2.BatchNorm2d_bn1                          [64]    [4, 64, 56, 56]   \n",
      "26_layer1.2.ReLU_relu                                   -    [4, 64, 56, 56]   \n",
      "27_layer1.2.Conv2d_conv2                   [64, 64, 3, 3]    [4, 64, 56, 56]   \n",
      "28_layer1.2.BatchNorm2d_bn2                          [64]    [4, 64, 56, 56]   \n",
      "29_layer1.2.ReLU_relu                                   -    [4, 64, 56, 56]   \n",
      "30_layer1.2.Conv2d_conv3                  [64, 256, 1, 1]   [4, 256, 56, 56]   \n",
      "31_layer1.2.BatchNorm2d_bn3                         [256]   [4, 256, 56, 56]   \n",
      "32_layer1.2.ReLU_relu                                   -   [4, 256, 56, 56]   \n",
      "33_layer2.0.Conv2d_conv1                 [256, 128, 1, 1]   [4, 128, 56, 56]   \n",
      "34_layer2.0.BatchNorm2d_bn1                         [128]   [4, 128, 56, 56]   \n",
      "35_layer2.0.ReLU_relu                                   -   [4, 128, 56, 56]   \n",
      "36_layer2.0.Conv2d_conv2                 [128, 128, 3, 3]   [4, 128, 28, 28]   \n",
      "37_layer2.0.BatchNorm2d_bn2                         [128]   [4, 128, 28, 28]   \n",
      "38_layer2.0.ReLU_relu                                   -   [4, 128, 28, 28]   \n",
      "39_layer2.0.Conv2d_conv3                 [128, 512, 1, 1]   [4, 512, 28, 28]   \n",
      "40_layer2.0.BatchNorm2d_bn3                         [512]   [4, 512, 28, 28]   \n",
      "41_layer2.0.downsample.Conv2d_0          [256, 512, 1, 1]   [4, 512, 28, 28]   \n",
      "42_layer2.0.downsample.BatchNorm2d_1                [512]   [4, 512, 28, 28]   \n",
      "43_layer2.0.ReLU_relu                                   -   [4, 512, 28, 28]   \n",
      "44_layer2.1.Conv2d_conv1                 [512, 128, 1, 1]   [4, 128, 28, 28]   \n",
      "45_layer2.1.BatchNorm2d_bn1                         [128]   [4, 128, 28, 28]   \n",
      "46_layer2.1.ReLU_relu                                   -   [4, 128, 28, 28]   \n",
      "47_layer2.1.Conv2d_conv2                 [128, 128, 3, 3]   [4, 128, 28, 28]   \n",
      "48_layer2.1.BatchNorm2d_bn2                         [128]   [4, 128, 28, 28]   \n",
      "49_layer2.1.ReLU_relu                                   -   [4, 128, 28, 28]   \n",
      "50_layer2.1.Conv2d_conv3                 [128, 512, 1, 1]   [4, 512, 28, 28]   \n",
      "51_layer2.1.BatchNorm2d_bn3                         [512]   [4, 512, 28, 28]   \n",
      "52_layer2.1.ReLU_relu                                   -   [4, 512, 28, 28]   \n",
      "53_layer2.2.Conv2d_conv1                 [512, 128, 1, 1]   [4, 128, 28, 28]   \n",
      "54_layer2.2.BatchNorm2d_bn1                         [128]   [4, 128, 28, 28]   \n",
      "55_layer2.2.ReLU_relu                                   -   [4, 128, 28, 28]   \n",
      "56_layer2.2.Conv2d_conv2                 [128, 128, 3, 3]   [4, 128, 28, 28]   \n",
      "57_layer2.2.BatchNorm2d_bn2                         [128]   [4, 128, 28, 28]   \n",
      "58_layer2.2.ReLU_relu                                   -   [4, 128, 28, 28]   \n",
      "59_layer2.2.Conv2d_conv3                 [128, 512, 1, 1]   [4, 512, 28, 28]   \n",
      "60_layer2.2.BatchNorm2d_bn3                         [512]   [4, 512, 28, 28]   \n",
      "61_layer2.2.ReLU_relu                                   -   [4, 512, 28, 28]   \n",
      "62_layer2.3.Conv2d_conv1                 [512, 128, 1, 1]   [4, 128, 28, 28]   \n",
      "63_layer2.3.BatchNorm2d_bn1                         [128]   [4, 128, 28, 28]   \n",
      "64_layer2.3.ReLU_relu                                   -   [4, 128, 28, 28]   \n",
      "65_layer2.3.Conv2d_conv2                 [128, 128, 3, 3]   [4, 128, 28, 28]   \n",
      "66_layer2.3.BatchNorm2d_bn2                         [128]   [4, 128, 28, 28]   \n",
      "67_layer2.3.ReLU_relu                                   -   [4, 128, 28, 28]   \n",
      "68_layer2.3.Conv2d_conv3                 [128, 512, 1, 1]   [4, 512, 28, 28]   \n",
      "69_layer2.3.BatchNorm2d_bn3                         [512]   [4, 512, 28, 28]   \n",
      "70_layer2.3.ReLU_relu                                   -   [4, 512, 28, 28]   \n",
      "71_layer3.0.Conv2d_conv1                 [512, 256, 1, 1]   [4, 256, 28, 28]   \n",
      "72_layer3.0.BatchNorm2d_bn1                         [256]   [4, 256, 28, 28]   \n",
      "73_layer3.0.ReLU_relu                                   -   [4, 256, 28, 28]   \n",
      "74_layer3.0.Conv2d_conv2                 [256, 256, 3, 3]   [4, 256, 14, 14]   \n",
      "75_layer3.0.BatchNorm2d_bn2                         [256]   [4, 256, 14, 14]   \n",
      "76_layer3.0.ReLU_relu                                   -   [4, 256, 14, 14]   \n",
      "77_layer3.0.Conv2d_conv3                [256, 1024, 1, 1]  [4, 1024, 14, 14]   \n",
      "78_layer3.0.BatchNorm2d_bn3                        [1024]  [4, 1024, 14, 14]   \n",
      "79_layer3.0.downsample.Conv2d_0         [512, 1024, 1, 1]  [4, 1024, 14, 14]   \n",
      "80_layer3.0.downsample.BatchNorm2d_1               [1024]  [4, 1024, 14, 14]   \n",
      "81_layer3.0.ReLU_relu                                   -  [4, 1024, 14, 14]   \n",
      "82_layer3.1.Conv2d_conv1                [1024, 256, 1, 1]   [4, 256, 14, 14]   \n",
      "83_layer3.1.BatchNorm2d_bn1                         [256]   [4, 256, 14, 14]   \n",
      "84_layer3.1.ReLU_relu                                   -   [4, 256, 14, 14]   \n",
      "85_layer3.1.Conv2d_conv2                 [256, 256, 3, 3]   [4, 256, 14, 14]   \n",
      "86_layer3.1.BatchNorm2d_bn2                         [256]   [4, 256, 14, 14]   \n",
      "87_layer3.1.ReLU_relu                                   -   [4, 256, 14, 14]   \n",
      "88_layer3.1.Conv2d_conv3                [256, 1024, 1, 1]  [4, 1024, 14, 14]   \n",
      "89_layer3.1.BatchNorm2d_bn3                        [1024]  [4, 1024, 14, 14]   \n",
      "90_layer3.1.ReLU_relu                                   -  [4, 1024, 14, 14]   \n",
      "91_layer3.2.Conv2d_conv1                [1024, 256, 1, 1]   [4, 256, 14, 14]   \n",
      "92_layer3.2.BatchNorm2d_bn1                         [256]   [4, 256, 14, 14]   \n",
      "93_layer3.2.ReLU_relu                                   -   [4, 256, 14, 14]   \n",
      "94_layer3.2.Conv2d_conv2                 [256, 256, 3, 3]   [4, 256, 14, 14]   \n",
      "95_layer3.2.BatchNorm2d_bn2                         [256]   [4, 256, 14, 14]   \n",
      "96_layer3.2.ReLU_relu                                   -   [4, 256, 14, 14]   \n",
      "97_layer3.2.Conv2d_conv3                [256, 1024, 1, 1]  [4, 1024, 14, 14]   \n",
      "98_layer3.2.BatchNorm2d_bn3                        [1024]  [4, 1024, 14, 14]   \n",
      "99_layer3.2.ReLU_relu                                   -  [4, 1024, 14, 14]   \n",
      "100_layer3.3.Conv2d_conv1               [1024, 256, 1, 1]   [4, 256, 14, 14]   \n",
      "101_layer3.3.BatchNorm2d_bn1                        [256]   [4, 256, 14, 14]   \n",
      "102_layer3.3.ReLU_relu                                  -   [4, 256, 14, 14]   \n",
      "103_layer3.3.Conv2d_conv2                [256, 256, 3, 3]   [4, 256, 14, 14]   \n",
      "104_layer3.3.BatchNorm2d_bn2                        [256]   [4, 256, 14, 14]   \n",
      "105_layer3.3.ReLU_relu                                  -   [4, 256, 14, 14]   \n",
      "106_layer3.3.Conv2d_conv3               [256, 1024, 1, 1]  [4, 1024, 14, 14]   \n",
      "107_layer3.3.BatchNorm2d_bn3                       [1024]  [4, 1024, 14, 14]   \n",
      "108_layer3.3.ReLU_relu                                  -  [4, 1024, 14, 14]   \n",
      "109_layer3.4.Conv2d_conv1               [1024, 256, 1, 1]   [4, 256, 14, 14]   \n",
      "110_layer3.4.BatchNorm2d_bn1                        [256]   [4, 256, 14, 14]   \n",
      "111_layer3.4.ReLU_relu                                  -   [4, 256, 14, 14]   \n",
      "112_layer3.4.Conv2d_conv2                [256, 256, 3, 3]   [4, 256, 14, 14]   \n",
      "113_layer3.4.BatchNorm2d_bn2                        [256]   [4, 256, 14, 14]   \n",
      "114_layer3.4.ReLU_relu                                  -   [4, 256, 14, 14]   \n",
      "115_layer3.4.Conv2d_conv3               [256, 1024, 1, 1]  [4, 1024, 14, 14]   \n",
      "116_layer3.4.BatchNorm2d_bn3                       [1024]  [4, 1024, 14, 14]   \n",
      "117_layer3.4.ReLU_relu                                  -  [4, 1024, 14, 14]   \n",
      "118_layer3.5.Conv2d_conv1               [1024, 256, 1, 1]   [4, 256, 14, 14]   \n",
      "119_layer3.5.BatchNorm2d_bn1                        [256]   [4, 256, 14, 14]   \n",
      "120_layer3.5.ReLU_relu                                  -   [4, 256, 14, 14]   \n",
      "121_layer3.5.Conv2d_conv2                [256, 256, 3, 3]   [4, 256, 14, 14]   \n",
      "122_layer3.5.BatchNorm2d_bn2                        [256]   [4, 256, 14, 14]   \n",
      "123_layer3.5.ReLU_relu                                  -   [4, 256, 14, 14]   \n",
      "124_layer3.5.Conv2d_conv3               [256, 1024, 1, 1]  [4, 1024, 14, 14]   \n",
      "125_layer3.5.BatchNorm2d_bn3                       [1024]  [4, 1024, 14, 14]   \n",
      "126_layer3.5.ReLU_relu                                  -  [4, 1024, 14, 14]   \n",
      "127_layer4.0.Conv2d_conv1               [1024, 512, 1, 1]   [4, 512, 14, 14]   \n",
      "128_layer4.0.BatchNorm2d_bn1                        [512]   [4, 512, 14, 14]   \n",
      "129_layer4.0.ReLU_relu                                  -   [4, 512, 14, 14]   \n",
      "130_layer4.0.Conv2d_conv2                [512, 512, 3, 3]     [4, 512, 7, 7]   \n",
      "131_layer4.0.BatchNorm2d_bn2                        [512]     [4, 512, 7, 7]   \n",
      "132_layer4.0.ReLU_relu                                  -     [4, 512, 7, 7]   \n",
      "133_layer4.0.Conv2d_conv3               [512, 2048, 1, 1]    [4, 2048, 7, 7]   \n",
      "134_layer4.0.BatchNorm2d_bn3                       [2048]    [4, 2048, 7, 7]   \n",
      "135_layer4.0.downsample.Conv2d_0       [1024, 2048, 1, 1]    [4, 2048, 7, 7]   \n",
      "136_layer4.0.downsample.BatchNorm2d_1              [2048]    [4, 2048, 7, 7]   \n",
      "137_layer4.0.ReLU_relu                                  -    [4, 2048, 7, 7]   \n",
      "138_layer4.1.Conv2d_conv1               [2048, 512, 1, 1]     [4, 512, 7, 7]   \n",
      "139_layer4.1.BatchNorm2d_bn1                        [512]     [4, 512, 7, 7]   \n",
      "140_layer4.1.ReLU_relu                                  -     [4, 512, 7, 7]   \n",
      "141_layer4.1.Conv2d_conv2                [512, 512, 3, 3]     [4, 512, 7, 7]   \n",
      "142_layer4.1.BatchNorm2d_bn2                        [512]     [4, 512, 7, 7]   \n",
      "143_layer4.1.ReLU_relu                                  -     [4, 512, 7, 7]   \n",
      "144_layer4.1.Conv2d_conv3               [512, 2048, 1, 1]    [4, 2048, 7, 7]   \n",
      "145_layer4.1.BatchNorm2d_bn3                       [2048]    [4, 2048, 7, 7]   \n",
      "146_layer4.1.ReLU_relu                                  -    [4, 2048, 7, 7]   \n",
      "147_layer4.2.Conv2d_conv1               [2048, 512, 1, 1]     [4, 512, 7, 7]   \n",
      "148_layer4.2.BatchNorm2d_bn1                        [512]     [4, 512, 7, 7]   \n",
      "149_layer4.2.ReLU_relu                                  -     [4, 512, 7, 7]   \n",
      "150_layer4.2.Conv2d_conv2                [512, 512, 3, 3]     [4, 512, 7, 7]   \n",
      "151_layer4.2.BatchNorm2d_bn2                        [512]     [4, 512, 7, 7]   \n",
      "152_layer4.2.ReLU_relu                                  -     [4, 512, 7, 7]   \n",
      "153_layer4.2.Conv2d_conv3               [512, 2048, 1, 1]    [4, 2048, 7, 7]   \n",
      "154_layer4.2.BatchNorm2d_bn3                       [2048]    [4, 2048, 7, 7]   \n",
      "155_layer4.2.ReLU_relu                                  -    [4, 2048, 7, 7]   \n",
      "156_avgpool                                             -    [4, 2048, 1, 1]   \n",
      "157_fc                                       [2048, 1000]          [4, 1000]   \n",
      "\n",
      "                                          Params    Mult-Adds  \n",
      "Layer                                                          \n",
      "0_conv1                                   9.408k  118.013952M  \n",
      "1_bn1                                      128.0         64.0  \n",
      "2_relu                                         -            -  \n",
      "3_maxpool                                      -            -  \n",
      "4_layer1.0.Conv2d_conv1                   4.096k   12.845056M  \n",
      "5_layer1.0.BatchNorm2d_bn1                 128.0         64.0  \n",
      "6_layer1.0.ReLU_relu                           -            -  \n",
      "7_layer1.0.Conv2d_conv2                  36.864k  115.605504M  \n",
      "8_layer1.0.BatchNorm2d_bn2                 128.0         64.0  \n",
      "9_layer1.0.ReLU_relu                           -            -  \n",
      "10_layer1.0.Conv2d_conv3                 16.384k   51.380224M  \n",
      "11_layer1.0.BatchNorm2d_bn3                512.0        256.0  \n",
      "12_layer1.0.downsample.Conv2d_0          16.384k   51.380224M  \n",
      "13_layer1.0.downsample.BatchNorm2d_1       512.0        256.0  \n",
      "14_layer1.0.ReLU_relu                          -            -  \n",
      "15_layer1.1.Conv2d_conv1                 16.384k   51.380224M  \n",
      "16_layer1.1.BatchNorm2d_bn1                128.0         64.0  \n",
      "17_layer1.1.ReLU_relu                          -            -  \n",
      "18_layer1.1.Conv2d_conv2                 36.864k  115.605504M  \n",
      "19_layer1.1.BatchNorm2d_bn2                128.0         64.0  \n",
      "20_layer1.1.ReLU_relu                          -            -  \n",
      "21_layer1.1.Conv2d_conv3                 16.384k   51.380224M  \n",
      "22_layer1.1.BatchNorm2d_bn3                512.0        256.0  \n",
      "23_layer1.1.ReLU_relu                          -            -  \n",
      "24_layer1.2.Conv2d_conv1                 16.384k   51.380224M  \n",
      "25_layer1.2.BatchNorm2d_bn1                128.0         64.0  \n",
      "26_layer1.2.ReLU_relu                          -            -  \n",
      "27_layer1.2.Conv2d_conv2                 36.864k  115.605504M  \n",
      "28_layer1.2.BatchNorm2d_bn2                128.0         64.0  \n",
      "29_layer1.2.ReLU_relu                          -            -  \n",
      "30_layer1.2.Conv2d_conv3                 16.384k   51.380224M  \n",
      "31_layer1.2.BatchNorm2d_bn3                512.0        256.0  \n",
      "32_layer1.2.ReLU_relu                          -            -  \n",
      "33_layer2.0.Conv2d_conv1                 32.768k  102.760448M  \n",
      "34_layer2.0.BatchNorm2d_bn1                256.0        128.0  \n",
      "35_layer2.0.ReLU_relu                          -            -  \n",
      "36_layer2.0.Conv2d_conv2                147.456k  115.605504M  \n",
      "37_layer2.0.BatchNorm2d_bn2                256.0        128.0  \n",
      "38_layer2.0.ReLU_relu                          -            -  \n",
      "39_layer2.0.Conv2d_conv3                 65.536k   51.380224M  \n",
      "40_layer2.0.BatchNorm2d_bn3               1.024k        512.0  \n",
      "41_layer2.0.downsample.Conv2d_0         131.072k  102.760448M  \n",
      "42_layer2.0.downsample.BatchNorm2d_1      1.024k        512.0  \n",
      "43_layer2.0.ReLU_relu                          -            -  \n",
      "44_layer2.1.Conv2d_conv1                 65.536k   51.380224M  \n",
      "45_layer2.1.BatchNorm2d_bn1                256.0        128.0  \n",
      "46_layer2.1.ReLU_relu                          -            -  \n",
      "47_layer2.1.Conv2d_conv2                147.456k  115.605504M  \n",
      "48_layer2.1.BatchNorm2d_bn2                256.0        128.0  \n",
      "49_layer2.1.ReLU_relu                          -            -  \n",
      "50_layer2.1.Conv2d_conv3                 65.536k   51.380224M  \n",
      "51_layer2.1.BatchNorm2d_bn3               1.024k        512.0  \n",
      "52_layer2.1.ReLU_relu                          -            -  \n",
      "53_layer2.2.Conv2d_conv1                 65.536k   51.380224M  \n",
      "54_layer2.2.BatchNorm2d_bn1                256.0        128.0  \n",
      "55_layer2.2.ReLU_relu                          -            -  \n",
      "56_layer2.2.Conv2d_conv2                147.456k  115.605504M  \n",
      "57_layer2.2.BatchNorm2d_bn2                256.0        128.0  \n",
      "58_layer2.2.ReLU_relu                          -            -  \n",
      "59_layer2.2.Conv2d_conv3                 65.536k   51.380224M  \n",
      "60_layer2.2.BatchNorm2d_bn3               1.024k        512.0  \n",
      "61_layer2.2.ReLU_relu                          -            -  \n",
      "62_layer2.3.Conv2d_conv1                 65.536k   51.380224M  \n",
      "63_layer2.3.BatchNorm2d_bn1                256.0        128.0  \n",
      "64_layer2.3.ReLU_relu                          -            -  \n",
      "65_layer2.3.Conv2d_conv2                147.456k  115.605504M  \n",
      "66_layer2.3.BatchNorm2d_bn2                256.0        128.0  \n",
      "67_layer2.3.ReLU_relu                          -            -  \n",
      "68_layer2.3.Conv2d_conv3                 65.536k   51.380224M  \n",
      "69_layer2.3.BatchNorm2d_bn3               1.024k        512.0  \n",
      "70_layer2.3.ReLU_relu                          -            -  \n",
      "71_layer3.0.Conv2d_conv1                131.072k  102.760448M  \n",
      "72_layer3.0.BatchNorm2d_bn1                512.0        256.0  \n",
      "73_layer3.0.ReLU_relu                          -            -  \n",
      "74_layer3.0.Conv2d_conv2                589.824k  115.605504M  \n",
      "75_layer3.0.BatchNorm2d_bn2                512.0        256.0  \n",
      "76_layer3.0.ReLU_relu                          -            -  \n",
      "77_layer3.0.Conv2d_conv3                262.144k   51.380224M  \n",
      "78_layer3.0.BatchNorm2d_bn3               2.048k       1.024k  \n",
      "79_layer3.0.downsample.Conv2d_0         524.288k  102.760448M  \n",
      "80_layer3.0.downsample.BatchNorm2d_1      2.048k       1.024k  \n",
      "81_layer3.0.ReLU_relu                          -            -  \n",
      "82_layer3.1.Conv2d_conv1                262.144k   51.380224M  \n",
      "83_layer3.1.BatchNorm2d_bn1                512.0        256.0  \n",
      "84_layer3.1.ReLU_relu                          -            -  \n",
      "85_layer3.1.Conv2d_conv2                589.824k  115.605504M  \n",
      "86_layer3.1.BatchNorm2d_bn2                512.0        256.0  \n",
      "87_layer3.1.ReLU_relu                          -            -  \n",
      "88_layer3.1.Conv2d_conv3                262.144k   51.380224M  \n",
      "89_layer3.1.BatchNorm2d_bn3               2.048k       1.024k  \n",
      "90_layer3.1.ReLU_relu                          -            -  \n",
      "91_layer3.2.Conv2d_conv1                262.144k   51.380224M  \n",
      "92_layer3.2.BatchNorm2d_bn1                512.0        256.0  \n",
      "93_layer3.2.ReLU_relu                          -            -  \n",
      "94_layer3.2.Conv2d_conv2                589.824k  115.605504M  \n",
      "95_layer3.2.BatchNorm2d_bn2                512.0        256.0  \n",
      "96_layer3.2.ReLU_relu                          -            -  \n",
      "97_layer3.2.Conv2d_conv3                262.144k   51.380224M  \n",
      "98_layer3.2.BatchNorm2d_bn3               2.048k       1.024k  \n",
      "99_layer3.2.ReLU_relu                          -            -  \n",
      "100_layer3.3.Conv2d_conv1               262.144k   51.380224M  \n",
      "101_layer3.3.BatchNorm2d_bn1               512.0        256.0  \n",
      "102_layer3.3.ReLU_relu                         -            -  \n",
      "103_layer3.3.Conv2d_conv2               589.824k  115.605504M  \n",
      "104_layer3.3.BatchNorm2d_bn2               512.0        256.0  \n",
      "105_layer3.3.ReLU_relu                         -            -  \n",
      "106_layer3.3.Conv2d_conv3               262.144k   51.380224M  \n",
      "107_layer3.3.BatchNorm2d_bn3              2.048k       1.024k  \n",
      "108_layer3.3.ReLU_relu                         -            -  \n",
      "109_layer3.4.Conv2d_conv1               262.144k   51.380224M  \n",
      "110_layer3.4.BatchNorm2d_bn1               512.0        256.0  \n",
      "111_layer3.4.ReLU_relu                         -            -  \n",
      "112_layer3.4.Conv2d_conv2               589.824k  115.605504M  \n",
      "113_layer3.4.BatchNorm2d_bn2               512.0        256.0  \n",
      "114_layer3.4.ReLU_relu                         -            -  \n",
      "115_layer3.4.Conv2d_conv3               262.144k   51.380224M  \n",
      "116_layer3.4.BatchNorm2d_bn3              2.048k       1.024k  \n",
      "117_layer3.4.ReLU_relu                         -            -  \n",
      "118_layer3.5.Conv2d_conv1               262.144k   51.380224M  \n",
      "119_layer3.5.BatchNorm2d_bn1               512.0        256.0  \n",
      "120_layer3.5.ReLU_relu                         -            -  \n",
      "121_layer3.5.Conv2d_conv2               589.824k  115.605504M  \n",
      "122_layer3.5.BatchNorm2d_bn2               512.0        256.0  \n",
      "123_layer3.5.ReLU_relu                         -            -  \n",
      "124_layer3.5.Conv2d_conv3               262.144k   51.380224M  \n",
      "125_layer3.5.BatchNorm2d_bn3              2.048k       1.024k  \n",
      "126_layer3.5.ReLU_relu                         -            -  \n",
      "127_layer4.0.Conv2d_conv1               524.288k  102.760448M  \n",
      "128_layer4.0.BatchNorm2d_bn1              1.024k        512.0  \n",
      "129_layer4.0.ReLU_relu                         -            -  \n",
      "130_layer4.0.Conv2d_conv2              2.359296M  115.605504M  \n",
      "131_layer4.0.BatchNorm2d_bn2              1.024k        512.0  \n",
      "132_layer4.0.ReLU_relu                         -            -  \n",
      "133_layer4.0.Conv2d_conv3              1.048576M   51.380224M  \n",
      "134_layer4.0.BatchNorm2d_bn3              4.096k       2.048k  \n",
      "135_layer4.0.downsample.Conv2d_0       2.097152M  102.760448M  \n",
      "136_layer4.0.downsample.BatchNorm2d_1     4.096k       2.048k  \n",
      "137_layer4.0.ReLU_relu                         -            -  \n",
      "138_layer4.1.Conv2d_conv1              1.048576M   51.380224M  \n",
      "139_layer4.1.BatchNorm2d_bn1              1.024k        512.0  \n",
      "140_layer4.1.ReLU_relu                         -            -  \n",
      "141_layer4.1.Conv2d_conv2              2.359296M  115.605504M  \n",
      "142_layer4.1.BatchNorm2d_bn2              1.024k        512.0  \n",
      "143_layer4.1.ReLU_relu                         -            -  \n",
      "144_layer4.1.Conv2d_conv3              1.048576M   51.380224M  \n",
      "145_layer4.1.BatchNorm2d_bn3              4.096k       2.048k  \n",
      "146_layer4.1.ReLU_relu                         -            -  \n",
      "147_layer4.2.Conv2d_conv1              1.048576M   51.380224M  \n",
      "148_layer4.2.BatchNorm2d_bn1              1.024k        512.0  \n",
      "149_layer4.2.ReLU_relu                         -            -  \n",
      "150_layer4.2.Conv2d_conv2              2.359296M  115.605504M  \n",
      "151_layer4.2.BatchNorm2d_bn2              1.024k        512.0  \n",
      "152_layer4.2.ReLU_relu                         -            -  \n",
      "153_layer4.2.Conv2d_conv3              1.048576M   51.380224M  \n",
      "154_layer4.2.BatchNorm2d_bn3              4.096k       2.048k  \n",
      "155_layer4.2.ReLU_relu                         -            -  \n",
      "156_avgpool                                    -            -  \n",
      "157_fc                                    2.049M       2.048M  \n",
      "----------------------------------------------------------------------------------------------------\n",
      "                            Totals\n",
      "Total params            25.557032M\n",
      "Trainable params        25.557032M\n",
      "Non-trainable params           0.0\n",
      "Mult-Adds             4.089210816G\n",
      "====================================================================================================\n",
      "\n",
      "\n",
      "<class 'torch.Tensor'>\n",
      "torch.Size([4, 1000])\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "from torchvision import models\n",
    "from torchsummaryX import summary\n",
    "\n",
    "# 参数更改\n",
    "modelshow = models.resnet50()\n",
    "testdata = torch.zeros(4, 3, 224, 224)\n",
    "\n",
    "print(modelshow)\n",
    "print('\\n')\n",
    "if torch.cuda.is_available():\n",
    "    #      模型               [N, C, H, W]\n",
    "    modelshow = modelshow.cuda()\n",
    "    testdata = testdata.cuda()\n",
    "\n",
    "summary(modelshow, testdata)\n",
    "out = modelshow(testdata)\n",
    "print('\\n')\n",
    "print(type(out))\n",
    "print(out.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "0RtDwk5Gi4eN"
   },
   "source": [
    "## 数据处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "VGvkmbbji4eO"
   },
   "source": [
    "### 数据制作"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "iBs5yjLBi4eP"
   },
   "source": [
    "#### 猫狗数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "f2e3MOALi4eQ"
   },
   "outputs": [],
   "source": [
    "# 压缩包路径"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "8BQ7s2JQi4eT"
   },
   "source": [
    "### 数据增强"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "C9tU23vKi4eU"
   },
   "outputs": [],
   "source": [
    "train_data_transform = transforms.Compose([\n",
    "    transforms.Resize((84, 84)),\n",
    "    transforms.CenterCrop(84),\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n",
    "])\n",
    "\n",
    "val_data_transform = transforms.Compose([\n",
    "    transforms.Resize((84, 84)),\n",
    "    transforms.CenterCrop(84),\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n",
    "])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "9EIGtcyri4eV"
   },
   "source": [
    "### 数据导入"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "F1mIVKhuMg06"
   },
   "source": [
    "#### 猫狗数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "1DIGAaLQi4eW"
   },
   "outputs": [],
   "source": [
    "# 数据导入参数\n",
    "train_data_path = \"./data\\\\catdog\\\\train\"\n",
    "train_batch_size = 2\n",
    "\n",
    "val_data_path = \"./data\\\\catdog\\\\val\"\n",
    "val_batch_size = 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "WHwwOP7si4eX",
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "train_dataset = datasets.ImageFolder(root=train_data_path, transform=train_data_transform)\n",
    "train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=train_batch_size, shuffle=True, num_workers=0)\n",
    "\n",
    "val_dataset = datasets.ImageFolder(root=val_data_path, transform=val_data_transform)\n",
    "val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=val_batch_size, shuffle=True, num_workers=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "1ups41iEi4ea",
    "outputId": "427271ce-5bf2-4406-e722-79f440aecb46"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'cats': 0, 'dogs': 1}\n",
      "Compose(\n",
      "    Resize(size=(84, 84), interpolation=PIL.Image.BILINEAR)\n",
      "    CenterCrop(size=(84, 84))\n",
      "    ToTensor()\n",
      "    Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n",
      ")\n",
      "('./data\\\\catdog\\\\train\\\\cats\\\\cat.4.jpg', 0)\n",
      "False\n"
     ]
    }
   ],
   "source": [
    "# 打印标签对应关系\n",
    "print(train_loader.dataset.class_to_idx)\n",
    "print(train_dataset.transform)\n",
    "print(train_dataset.imgs[34])\n",
    "print(train_loader.drop_last)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "pevnrP9HMrEv"
   },
   "source": [
    "#### CIFAR10数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "gHz8y-AmM22Y"
   },
   "outputs": [],
   "source": [
    "# 数据导入参数\n",
    "train_data_path = \"./data/cifar10\"\n",
    "train_batch_size = 8\n",
    "\n",
    "val_data_path = \"./data/cifar10\"\n",
    "val_batch_size = 4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 53
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 16453,
     "status": "ok",
     "timestamp": 1578039315117,
     "user": {
      "displayName": "宏沉一笑",
      "photoUrl": "",
      "userId": "12018462559157601606"
     },
     "user_tz": -480
    },
    "id": "u9FBA1qyMyCL",
    "outputId": "f595b245-d7bd-4ed2-fcb4-61e3bd253ff1"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n"
     ]
    }
   ],
   "source": [
    "train_dataset = datasets.CIFAR10(root=train_data_path, train=True, download=True, transform=train_data_transform)\n",
    "train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=train_batch_size, shuffle=True, num_workers=0)\n",
    "\n",
    "val_dataset = datasets.CIFAR10(root=val_data_path, train=False, download=False, transform=val_data_transform)\n",
    "val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=val_batch_size, shuffle=True, num_workers=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 35
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 862,
     "status": "ok",
     "timestamp": 1578038833698,
     "user": {
      "displayName": "宏沉一笑",
      "photoUrl": "",
      "userId": "12018462559157601606"
     },
     "user_tz": -480
    },
    "id": "fzz_i-OwW0Z-",
    "outputId": "2e3e4561-9fde-4b10-bf22-519b42345f48",
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([8, 1, 2, 6, 4, 6, 8, 5]) torch.Size([8, 3, 84, 84])\n"
     ]
    }
   ],
   "source": [
    "for i,data in enumerate(train_loader,0):\n",
    "  print(data[1], data[0].shape)\n",
    "  break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "m0LvoyLUoWo5"
   },
   "source": [
    "#### 西安美食分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "p-9kPSIfqWb2"
   },
   "outputs": [],
   "source": [
    "!cp -av /content/drive/'My Drive'/'Colab Notebooks'/Git-Code/xian.rar /content/xian.rar\n",
    "!unrar x xian.rar"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "b56lk0FqoWo5"
   },
   "outputs": [],
   "source": [
    "# 数据导入参数\n",
    "train_data_path = \"/content/datasets/train_val/train\"\n",
    "train_batch_size = 16\n",
    "\n",
    "val_data_path = \"/content/datasets/train_val/train\"\n",
    "val_batch_size = 16"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "S6_mrBF6oWo6"
   },
   "outputs": [],
   "source": [
    "train_dataset = datasets.ImageFolder(root=train_data_path, transform=train_data_transform)\n",
    "train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=train_batch_size, shuffle=True, num_workers=0)\n",
    "\n",
    "val_dataset = datasets.ImageFolder(root=val_data_path, transform=val_data_transform)\n",
    "val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=val_batch_size, shuffle=True, num_workers=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### CSV格式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "def pad_to_square(img, pad_value):\n",
    "    c, h, w = img.shape\n",
    "    dim_diff = np.abs(h - w)\n",
    "    # (upper / left) padding and (lower / right) padding\n",
    "    pad1, pad2 = dim_diff // 2, dim_diff - dim_diff // 2\n",
    "    # Determine padding\n",
    "    pad = (0, 0, pad1, pad2) if h <= w else (pad1, pad2, 0, 0)\n",
    "    # Add padding\n",
    "    img = F.pad(img, pad, \"constant\", value=pad_value)\n",
    "\n",
    "    return img, pad\n",
    "\n",
    "class CustomDataset(Dataset):\n",
    "    # 一些初始化过程代码\n",
    "    def __init__(self, csv_data_file, csv_class_file, base_dir=None, transforms=None):\n",
    "        self.date = pd.read_csv(csv_data_file, header=None)\n",
    "        self.classes = pd.read_csv(csv_class_file, delimiter=',', header=None)\n",
    "        self.transforms = transforms\n",
    "        if base_dir is None:\n",
    "            self.path = os.getcwd()\n",
    "        self.transform = transforms\n",
    "#         print(os.getcwd())\n",
    "#         print(type(self.date))\n",
    "#         print(self.date)\n",
    "#         print(self.classes)\n",
    "        # print(self.classes.index)\n",
    "        # print(self.data.loc[3])\n",
    "        # print(self.data[3].to_list())\n",
    "\n",
    "\n",
    "\n",
    "    # 返回对应标签的数据\n",
    "    def __getitem__(self, index):\n",
    "        print('index', index)\n",
    "        date = self.date.loc[index % len(self.date)].tolist()\n",
    "        image_path = os.path.join(self.path, date[0].rstrip())\n",
    "\n",
    "        img = transforms.ToTensor()(Image.open(image_path).convert('RGB'))\n",
    "\n",
    "        _, h, w = img.shape\n",
    "        h_factor, w_factor = (h, w)\n",
    "        img, pad = pad_to_square(img, 0)\n",
    "        _, padded_h, padded_w = img.shape\n",
    "\n",
    "        # 检测图片，至少3个通道\n",
    "        if len(img.shape) != 3:\n",
    "            img = img.unsqueeze(0)\n",
    "            img = img.expand((3, img.shape[1:]))\n",
    "        img = transforms.Resize(416, 416)\n",
    "\n",
    "        boxes = list()\n",
    "        x1 = w_factor * (date[1] - date[3] / 2)\n",
    "        y1 = h_factor * (date[2] - date[4] / 2)\n",
    "        x2 = w_factor * (date[1] + date[3] / 2)\n",
    "        y2 = h_factor * (date[2] + date[4] / 2)\n",
    "        # Adjust for added padding\n",
    "        x1 += pad[0]\n",
    "        y1 += pad[2]\n",
    "        x2 += pad[1]\n",
    "        y2 += pad[3]\n",
    "        # Returns (x, y, w, h)\n",
    "        date[1] = ((x1 + x2) / 2) / padded_w\n",
    "        date[2] = ((y1 + y2) / 2) / padded_h\n",
    "        date[3] *= w_factor / padded_w\n",
    "        date[4] *= h_factor / padded_h\n",
    "\n",
    "        targets = torch.zeros((len(date), 6))\n",
    "        targetsp = torch.from_numpy(np.array(date[1:]))\n",
    "\n",
    "        # return image_path, targetsp\n",
    "        print(type(img))\n",
    "        return img, targetsp\n",
    "\n",
    "    # 返回所有数据的数量\n",
    "    def __len__(self):\n",
    "        return len(self.date)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loader\n",
      "index 2\n",
      "<class 'torchvision.transforms.transforms.Resize'>\n",
      "index 5\n",
      "<class 'torchvision.transforms.transforms.Resize'>\n",
      "index 10\n",
      "<class 'torchvision.transforms.transforms.Resize'>\n",
      "index 30\n",
      "<class 'torchvision.transforms.transforms.Resize'>\n"
     ]
    },
    {
     "ename": "TypeError",
     "evalue": "default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found <class 'torchvision.transforms.transforms.Resize'>",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-32-54527c85bc12>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m     16\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     17\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 18\u001b[1;33m \u001b[0mtest\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'I:\\Today\\keras-retinanet\\CSV\\photo'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32m<ipython-input-32-54527c85bc12>\u001b[0m in \u001b[0;36mtest\u001b[1;34m(path)\u001b[0m\n\u001b[0;32m     11\u001b[0m                                                     shuffle=True)\n\u001b[0;32m     12\u001b[0m     \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'loader'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 13\u001b[1;33m     \u001b[1;32mfor\u001b[0m \u001b[0mitem\u001b[0m \u001b[1;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmn_dataset_loader\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     14\u001b[0m         \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     15\u001b[0m         \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mE:\\Soft\\anaconda\\envs\\retinanet\\lib\\site-packages\\torch\\utils\\data\\dataloader.py\u001b[0m in \u001b[0;36m__next__\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    344\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0m__next__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    345\u001b[0m         \u001b[0mindex\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_next_index\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m  \u001b[1;31m# may raise StopIteration\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 346\u001b[1;33m         \u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdataset_fetcher\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfetch\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mindex\u001b[0m\u001b[1;33m)\u001b[0m  \u001b[1;31m# may raise StopIteration\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    347\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpin_memory\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    348\u001b[0m             \u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_utils\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpin_memory\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpin_memory\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mE:\\Soft\\anaconda\\envs\\retinanet\\lib\\site-packages\\torch\\utils\\data\\_utils\\fetch.py\u001b[0m in \u001b[0;36mfetch\u001b[1;34m(self, possibly_batched_index)\u001b[0m\n\u001b[0;32m     45\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     46\u001b[0m             \u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdataset\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mpossibly_batched_index\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 47\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcollate_fn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32mE:\\Soft\\anaconda\\envs\\retinanet\\lib\\site-packages\\torch\\utils\\data\\_utils\\collate.py\u001b[0m in \u001b[0;36mdefault_collate\u001b[1;34m(batch)\u001b[0m\n\u001b[0;32m     78\u001b[0m     \u001b[1;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0melem\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcontainer_abcs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mSequence\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     79\u001b[0m         \u001b[0mtransposed\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mzip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mbatch\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 80\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mdefault_collate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msamples\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0msamples\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mtransposed\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     81\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     82\u001b[0m     \u001b[1;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdefault_collate_err_msg_format\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0melem_type\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mE:\\Soft\\anaconda\\envs\\retinanet\\lib\\site-packages\\torch\\utils\\data\\_utils\\collate.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m     78\u001b[0m     \u001b[1;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0melem\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcontainer_abcs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mSequence\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     79\u001b[0m         \u001b[0mtransposed\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mzip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mbatch\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 80\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mdefault_collate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msamples\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0msamples\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mtransposed\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     81\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     82\u001b[0m     \u001b[1;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdefault_collate_err_msg_format\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0melem_type\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mE:\\Soft\\anaconda\\envs\\retinanet\\lib\\site-packages\\torch\\utils\\data\\_utils\\collate.py\u001b[0m in \u001b[0;36mdefault_collate\u001b[1;34m(batch)\u001b[0m\n\u001b[0;32m     80\u001b[0m         \u001b[1;32mreturn\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mdefault_collate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msamples\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0msamples\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mtransposed\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     81\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 82\u001b[1;33m     \u001b[1;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdefault_collate_err_msg_format\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0melem_type\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m: default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found <class 'torchvision.transforms.transforms.Resize'>"
     ]
    }
   ],
   "source": [
    "train_an = './/data\\\\CSV\\\\train_annotations.csv'\n",
    "test_an = './/data\\\\CSV\\\\val_annotations.csv'\n",
    "classes = './/data\\\\CSV\\\\classes.csv'\n",
    "def test(path):\n",
    "\n",
    "    dataset = CustomDataset(train_an, classes)\n",
    "\n",
    "    # 定义 data loader\n",
    "    mn_dataset_loader = torch.utils.data.DataLoader(dataset=dataset,\n",
    "                                                    batch_size=4,\n",
    "                                                    shuffle=True)\n",
    "    print('loader')\n",
    "    for item in enumerate(mn_dataset_loader):\n",
    "        print(item)\n",
    "        print(type(item))\n",
    "\n",
    "\n",
    "test('I:\\Today\\keras-retinanet\\CSV\\photo')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "vevSzN4Vi4eb"
   },
   "source": [
    "## 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "nOD65HmPi4ec",
    "outputId": "02f64432-8fd2-4da0-e9c0-ae006002eb81"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Start training!\n",
      "Val  - [epoch - 1  1000] loss: 0.173,  val: 0.515\n",
      "Val  - [epoch - 2  1000] loss: 0.173,  val: 0.538\n",
      "Val  - [epoch - 3  1000] loss: 0.173,  val: 0.508\n",
      "Val  - [epoch - 4  1000] loss: 0.173,  val: 0.532\n",
      "Val  - [epoch - 5  1000] loss: 0.173,  val: 0.551\n",
      "Finished training!\n"
     ]
    }
   ],
   "source": [
    "# 批次数\n",
    "num_epochs = 5\n",
    "\n",
    "print('Start training!')\n",
    "for epoch in range(num_epochs):\n",
    "    train_loss = 0.0\n",
    "    train_acc = 0.0\n",
    "    net.train()\n",
    "    \n",
    "    for i,data in enumerate(train_loader,0):\n",
    "        inputs,labels = data\n",
    "        if torch.cuda.is_available():\n",
    "            inputs = Variable(inputs).cuda()\n",
    "            labels = Variable(labels).cuda()\n",
    "        else:\n",
    "            inputs = Variable(inputs)\n",
    "            labels = Variable(labels)\n",
    "        '''前向传播------------------------------------'''\n",
    "        # 归零梯度\n",
    "        optimizer.zero_grad()\n",
    "        # 得到前向传播的结果\n",
    "        outputs = net(inputs)\n",
    "        # 得到损失函数\n",
    "        loss = cirterion(outputs,labels)\n",
    "        # 反向传播\n",
    "        loss.backward()\n",
    "        # 更新模型\n",
    "        optimizer.step()\n",
    "        # 更新损失值\n",
    "        train_loss += loss.cpu().data.numpy()\n",
    "        # 更新准确率\n",
    "        _, pred = torch.max(outputs, 1)\n",
    "        num_correct = torch.sum(pred == labels)\n",
    "        train_acc += num_correct.cpu().data.numpy()\n",
    "        \n",
    "        if i % 2000 == 1999:\n",
    "            print('Train - [epoch - %d %5d] loss: %.3f,  val: %.3f' % (epoch + 1,\n",
    "                                                                      train_batch_size * len(train_loader),\n",
    "                                                                      train_loss/(train_batch_size * len(train_loader)), \n",
    "                                                                      train_acc/(train_batch_size * len(train_loader))  ))\n",
    "            train_loss = 0.0\n",
    "            train_acc = 0.0\n",
    "\n",
    "    '''--------------------验证集----------------------'''\n",
    "        # 锁定模型    \n",
    "    net.eval()\n",
    "\n",
    "    val_acc = 0.0\n",
    "    val_loss = 0.0\n",
    "\n",
    "    for data in val_loader:\n",
    "        images,labels = data\n",
    "        if torch.cuda.is_available():\n",
    "            images = Variable(images).cuda()\n",
    "            labels = Variable(labels).cuda()\n",
    "        else:\n",
    "            images = Variable(images)\n",
    "            labels = Variable(labels)\n",
    "        outputs = net(images)\n",
    "        # 得到损失函数\n",
    "        loss = cirterion(outputs,labels)\n",
    "        val_loss += loss.cpu().data.numpy()\n",
    "        _,predicted = torch.max(outputs.data,1)\n",
    "        correct = (predicted == labels).sum()\n",
    "        val_acc += correct.cpu().data.numpy()\n",
    "        \n",
    "    #print('test images: %d %%' % (100 * correct / total))\n",
    "    print('Val  - [epoch - %d %5d] loss: %.3f,  val: %.3f' % (epoch+1,\n",
    "                                                                 val_batch_size * len(val_loader) , \n",
    "                                                                 val_loss / (val_batch_size * len(val_loader)),\n",
    "                                                                 val_acc/(val_batch_size * len(val_loader))))\n",
    "    val_acc = 0.0\n",
    "    val_loss = 0.0\n",
    " \n",
    "print('Finished training!')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "7uuVAsCWoWo_"
   },
   "source": [
    "### 训练工具函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "tarr1qW1i4ef"
   },
   "outputs": [],
   "source": [
    "# 计算top值\n",
    "def accuracy(output, target, topk=(1,)):\n",
    "        \"\"\"Computes the accuracy over the k top predictions for the specified values of k\"\"\"\n",
    "        with torch.no_grad():\n",
    "            maxk = max(topk)\n",
    "            batch_size = target.size(0)\n",
    "\n",
    "            _, pred = output.topk(maxk, 1, True, True)\n",
    "            pred = pred.t()\n",
    "            correct = pred.eq(target.view(1, -1).expand_as(pred))\n",
    "\n",
    "            res = []\n",
    "            for k in topk:\n",
    "                    correct_k = correct[:k].view(-1).float().sum(0, keepdim=True)\n",
    "                    res.append(correct_k.mul_(100.0 / batch_size))\n",
    "            return res\n",
    "        \n",
    "def save_checkpoint(state, is_best, filename='./checkpoints/checkpoint.pth.tar'):\n",
    "    torch.save(state, filename)\n",
    "    \n",
    "    if is_best:\n",
    "        shutil.copyfile(filename, 'model_best.pth.tar')\n",
    "    \n",
    "# 每30个epoch更改一次学习率\n",
    "def adjust_learning_rate(optimizer, epoch, args):\n",
    "    \"\"\"Sets the learning rate to the initial LR decayed by 10 every 30 epochs\"\"\"\n",
    "    lr = args.lr * (0.1 ** (epoch // 30))\n",
    "    for param_group in optimizer.param_groups:\n",
    "        param_group['lr'] = lr\n",
    "\n",
    "class ProgressMeter(object):\n",
    "    def __init__(self, num_batches, meters, prefix=\"\"):\n",
    "        self.batch_fmtstr = self._get_batch_fmtstr(num_batches)\n",
    "        self.meters = meters\n",
    "        self.prefix = prefix\n",
    "\n",
    "    def display(self, batch):\n",
    "        entries = [self.prefix + self.batch_fmtstr.format(batch)]\n",
    "        entries += [str(meter) for meter in self.meters]\n",
    "        print('\\t'.join(entries))\n",
    "\n",
    "    def _get_batch_fmtstr(self, num_batches):\n",
    "        num_digits = len(str(num_batches // 1))\n",
    "        fmt = '{:' + str(num_digits) + 'd}'\n",
    "        return '[' + fmt + '/' + fmt.format(num_batches) + ']'\n",
    "        \n",
    "class AverageMeter(object):\n",
    "    \"\"\"Computes and stores the average and current value\"\"\"\n",
    "    def __init__(self, name, fmt=':f'):\n",
    "        self.name = name\n",
    "        self.fmt = fmt\n",
    "        self.reset()\n",
    "\n",
    "    def reset(self):\n",
    "        self.val = 0\n",
    "        self.avg = 0\n",
    "        self.sum = 0\n",
    "        self.count = 0\n",
    "\n",
    "    def update(self, val, n=1):\n",
    "        self.val = val\n",
    "        self.sum += val * n\n",
    "        self.count += n\n",
    "        self.avg = self.sum / self.count\n",
    "\n",
    "    def __str__(self):\n",
    "        fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})'\n",
    "        return fmtstr.format(**self.__dict__)\n",
    "\n",
    "class logger(object):\n",
    "    def __init__(self, logdir=\"logs\"):\n",
    "        self.writer = SummaryWriter(log_dir=logdir)\n",
    "        \n",
    "    def add_model(self, model, input_data):\n",
    "        self.writer.add_graph(model, (input_data,))\n",
    "        \n",
    "    def add_data(self, name, data, epoch):\n",
    "        self.writer.add_scalar(name, data, epoch)\n",
    "        \n",
    "    def add_train_data(self, train, val, epoch):\n",
    "        self.add_data('train_acc1', train[0], epoch)\n",
    "        self.add_data('train_acc5', train[1], epoch)\n",
    "        self.add_data('train_loss', train[2], epoch)\n",
    "        self.add_data('val_acc1', val[0], epoch)\n",
    "        self.add_data('val_acc5', val[1], epoch)\n",
    "        self.add_data('val_loss', val[2], epoch)\n",
    "        \n",
    "    def close(self):\n",
    "        self.writer.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Fq46C5A_i4eg"
   },
   "source": [
    "### 训练函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "yEoCDTpxi4eh",
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# 批次数\n",
    "num_epochs = 5\n",
    "\n",
    "def train_model(train_loader, model, cirterion, optimizer, epoch):\n",
    "        # 训练模型\n",
    "        model.train()\n",
    "        \n",
    "        loss_avg=0.0\n",
    "        acc1_avg=0.0\n",
    "        acc5_avg=0.0\n",
    "        starttime = time.time()\n",
    "        for i, data in enumerate(train_loader):\n",
    "                images, target = data\n",
    "                if args.gpu is not None:\n",
    "                        images = Variable(images).cuda(args.gpu)\n",
    "                        target = Variable(target).cuda(args.gpu)\n",
    "                else:\n",
    "                        images = Variable(images)\n",
    "                        target = Variable(target)\n",
    "                \n",
    "                # 获取模型输出\n",
    "                output = model(images)\n",
    "                loss = cirterion(output, target)\n",
    "                # 获取损失值和准确值\n",
    "                acc1,  acc5 = accuracy(output, target, topk=(1, 1))\n",
    "                loss_avg += loss.cpu().data.numpy()\n",
    "                acc1_avg += acc1.cpu().data.numpy()\n",
    "                acc5_avg += acc5.cpu().data.numpy()\n",
    "                # 计算梯度并执行反向传播\n",
    "                optimizer.zero_grad()\n",
    "                loss.backward()\n",
    "                optimizer.step()\n",
    "                timelen = time.time() - starttime\n",
    "                starttime = time.time()\n",
    "                \n",
    "#                 print(\"Time: {time:6.4f}\\t Loss：{loss:6.4f} \\t Acc@1 {acc1:6.2f} \\t Acc@5 {acc5:6.2f}\".format(time=timelen,\n",
    "#                                                                                      loss=loss.item(), \n",
    "#                                                                                              acc1=acc1.item(), \n",
    "#                                                                                            acc5=acc5.item()))\n",
    "        print(\"Train Epoch: {epoch} Loss_avg：{loss:6.4f} \\t Acc@1_avg {acc1:6.2f} \\t Acc@5_avg {acc5:6.2f}\".format(epoch=epoch,\n",
    "                                                                  loss=loss_avg/len(train_loader),\n",
    "                                                                  acc1=acc1_avg[0]/len(train_loader),\n",
    "                                                                  acc5=acc5_avg[0]/len(train_loader) ))\n",
    "        return acc1_avg[0]/len(train_loader),acc5_avg[0]/len(train_loader),loss_avg/len(train_loader)\n",
    "\n",
    "# train_model(val_loader, net, cirterion, optimizer, 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "t8NVYnvMi4ej"
   },
   "source": [
    "### 验证函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "1-M63W3Ni4ek"
   },
   "outputs": [],
   "source": [
    "def val_model(train_loader, model, cirterion, optimizer, epoch):\n",
    "        # 训练模型\n",
    "        model.eval()\n",
    "        \n",
    "        loss_avg=torch.Tensor([0])\n",
    "        loss_avg = 0.0\n",
    "        acc1_avg=0.0\n",
    "        acc5_avg=0.0\n",
    "        starttime = time.time()\n",
    "        for i, data in enumerate(val_loader):\n",
    "                images, target = data\n",
    "                if args.gpu is not None:\n",
    "                        images = Variable(images).cuda(args.gpu)\n",
    "                        target = Variable(target).cuda(args.gpu)\n",
    "                else:\n",
    "                        images = Variable(images)\n",
    "                        target = Variable(target)\n",
    "                \n",
    "                # 获取模型输出\n",
    "                output = model(images)\n",
    "                loss = cirterion(output, target)\n",
    "                # 获取损失值和准确值\n",
    "                acc1,  acc5 = accuracy(output, target, topk=(1, 1))\n",
    "                loss_avg += loss.cpu().data.numpy()\n",
    "                acc1_avg += acc1.cpu().data.numpy()\n",
    "                acc5_avg += acc5.cpu().data.numpy()\n",
    "                timelen = time.time() - starttime\n",
    "                starttime = time.time()\n",
    "                \n",
    "#                 print(\"Time: {time:6.4f}\\t Loss：{loss:6.4f} \\t Acc@1 {acc1:6.2f} \\t Acc@5 {acc5:6.2f}\".format(time=timelen,\n",
    "#                                                                                           loss=loss.item(), \n",
    "#                                                                                           acc1=acc1.item(), \n",
    "#                                                                                           acc5=acc5.item()))\n",
    "\n",
    "        print(\"Val     Epoch: {epoch} Loss_avg：{loss:6.4f} \\t Acc@1_avg {acc1:6.2f} \\t Acc@5_avg {acc5:6.2f}\".format(epoch=epoch,\n",
    "                                                                      loss=loss_avg/len(train_loader),\n",
    "                                                                              acc1=acc1_avg[0]/len(train_loader),\n",
    "                                                                            acc5=acc5_avg[0]/len(train_loader)))\n",
    "    \n",
    "        return acc1_avg[0]/len(val_loader), acc5_avg[0]/len(val_loader), loss_avg/len(train_loader)\n",
    "\n",
    "# val_model(val_loader, net, cirterion, optimizer, 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "dRZ8Ktdui4em"
   },
   "source": [
    "### 整体训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 626771,
     "status": "error",
     "timestamp": 1578538329171,
     "user": {
      "displayName": "宏沉一笑",
      "photoUrl": "",
      "userId": "12018462559157601606"
     },
     "user_tz": -480
    },
    "id": "CdQCXCzvi4em",
    "outputId": "686c42bb-d073-43f3-871b-90d6a344dedb"
   },
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'os' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-1-4db7e4f0de83>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m     78\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     79\u001b[0m \u001b[1;31m# 训练函数\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 80\u001b[1;33m \u001b[0mmain_worker\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32m<ipython-input-1-4db7e4f0de83>\u001b[0m in \u001b[0;36mmain_worker\u001b[1;34m(num_epochs)\u001b[0m\n\u001b[0;32m      2\u001b[0m     \u001b[1;32mglobal\u001b[0m \u001b[0mbest_acc1\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m     \u001b[0mos\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmakedirs\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'checkpoints'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mexist_ok\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      5\u001b[0m     \u001b[0mlog\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlogger\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'logs'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'os' is not defined"
     ]
    }
   ],
   "source": [
    "def main_worker(num_epochs):\n",
    "    global best_acc1\n",
    "    \n",
    "    os.makedirs('checkpoints', exist_ok=True)\n",
    "    log = logger('logs')\n",
    "\n",
    "    # 创建模型 损失函数 优化器\n",
    "#     model = resnet50(pretrained=True)\n",
    "    model = Net()\n",
    "    \n",
    "    #     # 导入预训练模型\n",
    "#     if args.pretrained:\n",
    "#         model = models.__dict__[args.arch](pretrained=True)\n",
    "#     else:\n",
    "#         model = models.__dict__[args.arch]()\n",
    "\n",
    "#     model.fc =  nn.Linear(512 * 4, 54)\n",
    "    criterion = nn.CrossEntropyLoss()\n",
    "    if args.gpu is not None:\n",
    "        print('model is cuda')\n",
    "        torch.cuda.set_device(args.gpu)\n",
    "        model.cuda(args.gpu)\n",
    "        criterion = criterion.cuda(args.gpu)\n",
    "    optimizer = torch.optim.SGD(model.parameters(), args.lr,\n",
    "                                momentum=args.momentum,\n",
    "                                weight_decay=args.weight_decay)\n",
    "    \n",
    "#     # 导入保存的模型\n",
    "#     if args.resume:\n",
    "#         if os.path.isfile(args.resume):\n",
    "#             print(\"=> loading checkpoint '{}'\".format(args.resume))\n",
    "#             if args.gpu is None:\n",
    "#                 checkpoint = torch.load(args.resume)\n",
    "#             else:\n",
    "#                 # Map model to be loaded to specified single gpu.\n",
    "#                 loc = 'cuda:{}'.format(args.gpu)\n",
    "#                 checkpoint = torch.load(args.resume, map_location=loc)\n",
    "#             args.start_epoch = checkpoint['epoch']\n",
    "#             best_acc1 = checkpoint['best_acc1']\n",
    "#             model.load_state_dict(checkpoint['state_dict'])\n",
    "#             optimizer.load_state_dict(checkpoint['optimizer'])\n",
    "#             print(\"=> loaded checkpoint '{}' (epoch {})\"\n",
    "#                   .format(args.resume, checkpoint['epoch']))\n",
    "#     else:\n",
    "#         print(\"=> no checkpoint found at '{}'\".format(args.resume))\n",
    "    \n",
    "    args.distributed = args.world_size > 1 or args.multiprocessing_distributed\n",
    "        \n",
    "\n",
    "\n",
    "    print('Start training!')\n",
    "    log.add_model(model, torch.rand(1, 3, 84, 84).cuda())\n",
    "    starttime = time.time()\n",
    "    for epoch in range(num_epochs):\n",
    "        if args.distributed:\n",
    "            train_sampler.set_epoch(epoch)\n",
    "        adjust_learning_rate(optimizer, epoch, args)\n",
    "        \n",
    "        train_out = train_model(train_loader, model, criterion, optimizer, epoch)\n",
    "        val_out = val_model(val_loader, model, criterion, optimizer, epoch)\n",
    "        \n",
    "        is_best = val_out[0] > best_acc1\n",
    "        best_acc1 = max(val_out[0], best_acc1)\n",
    "        \n",
    "        log.add_train_data(train_out, val_out, epoch)\n",
    "        \n",
    "        save_checkpoint({\n",
    "                'epoch': epoch + 1,\n",
    "                'arch': model,\n",
    "                'state_dict': model.state_dict(),\n",
    "                'best_acc1': best_acc1,\n",
    "                'optimizer' : optimizer.state_dict(),\n",
    "            }, is_best)\n",
    "        \n",
    "    log.close()\n",
    "    print('Finished training!')\n",
    "    print('Train time is {time:.2f}'.format(time=time.time()-starttime))\n",
    "\n",
    "# 训练函数\n",
    "main_worker(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "QhYD1ddCp7ey"
   },
   "source": [
    "第一次训练  45.99  \n",
    "第二次训练  46.09  234秒   \n",
    "第三次训练  train  98.49   val 57.98   734秒"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Hh454DHni4eo"
   },
   "source": [
    "## 模型测试"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "qHMZXitPi4ep"
   },
   "source": [
    "### 多图片测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "4jnETdrBi4ep"
   },
   "outputs": [],
   "source": [
    "test_data_transform = transforms.Compose([\n",
    "    transforms.Resize((84, 84)),\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n",
    "])\n",
    "# 数据导入参数\n",
    "test_data_path = \"G:\\\\python\\\\kaggle\\\\cats_and_dogs_small\\\\test\"\n",
    "test_batch_size = 1\n",
    "\n",
    "test_dataset = datasets.ImageFolder(root=test_data_path, transform=test_data_transform)\n",
    "test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=test_batch_size, shuffle=True, num_workers=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "9QsI5UF4i4er",
    "outputId": "663393de-e71d-4f44-e0f6-0e4f48a22577"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1000"
      ]
     },
     "execution_count": 30,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(test_loader)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "JskjKGjPi4et",
    "outputId": "3b4716f5-3c12-4340-e0a1-31f666e59478"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Start Testing!\n",
      "test images: 59.00 %\n",
      "Finished Testing!\n"
     ]
    }
   ],
   "source": [
    "print('Start Testing!')\n",
    "\n",
    "test_acc = 0.0\n",
    "test_loss = 0.0\n",
    "\n",
    "for data in test_loader:\n",
    "    images,labels = data\n",
    "    if torch.cuda.is_available():\n",
    "        images = Variable(images).cuda()\n",
    "        labels = Variable(labels).cuda()\n",
    "    else:\n",
    "        images = Variable(images)\n",
    "        labels = Variable(labels)\n",
    "    outputs = net(images)\n",
    "    # 得到损失函数\n",
    "    loss = cirterion(outputs,labels)\n",
    "    test_loss += loss.cpu().data.numpy()\n",
    "    _,predicted = torch.max(outputs.data,1)\n",
    "    correct = (predicted == labels).sum()\n",
    "    test_acc += correct.cpu().data.numpy()\n",
    "\n",
    "print('test images: %.2f %%' % (100 * test_acc / len(test_loader)))\n",
    "\n",
    "print('Finished Testing!')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Rx_0im0Ci4ev"
   },
   "source": [
    "### 单图片测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "w_1Ifltoi4ev"
   },
   "outputs": [],
   "source": [
    "# 图片路径\n",
    "photopath = \"G:\\\\python\\\\kaggle\\\\cats_and_dogs_small\\\\test\\\\cats\\\\cat.1505.jpg\"\n",
    "\n",
    "img = Image.open(photopath).convert('RGB')\n",
    "img = img.resize((224,224),Image.ANTIALIAS)\n",
    "img = np.array(img)\n",
    "img = img.transpose((2,0,1))\n",
    "img = torch.from_numpy(img)\n",
    "img = torch.unsqueeze(img, 0).float()/255.0\n",
    "\n",
    "out = model(img.cuda())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_transforms=transforms.Compose([\n",
    "    transforms.Resize(224),\n",
    "    transforms.ToTensor()])\n",
    "\n",
    "img = Image.open(\"data//images//dog.jpg\")\n",
    "img.size\n",
    "imgtorch = data_transforms(img).unsqueeze(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class '__main__.BasicBlock'>\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 512, 7, 10])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = resnet18(pretrained=True)\n",
    "out = model(imgtorch)\n",
    "out.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 结果查看"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "show_transforms=transforms.Compose([\n",
    "    transforms.ToPILImage()\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAHCAAAAAAUx4O/AAAARklEQVR4nGNgwAQRDAwM14u+TGVgYGCQZmA8cuuP/vH7j3Y7sNRaJ6h9eM7U5HyW8eil077ytVrdDAwMDAyqDEoMDAwMDABlmRKId4t5lQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<PIL.Image.Image image mode=L size=10x7 at 0x2A5013C9C18>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "showimg = show_transforms(out.squeeze(0)[1])\n",
    "showimg"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "z9pIHCMji4ex"
   },
   "source": [
    "# Keras学习"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "wYeu6cQQi4ex"
   },
   "source": [
    "## 库导入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "j-CF5JAui4ex",
    "outputId": "237213d8-c71a-45b0-8368-9245a0cdd858"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorflow\\python\\framework\\dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "E:\\Soft\\anaconda\\envs\\cpu\\lib\\site-packages\\tensorboard\\compat\\tensorflow_stub\\dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n"
     ]
    }
   ],
   "source": [
    "import keras"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "swiQXgLFi4ez"
   },
   "source": [
    "## 模型建立"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "1g5WQ88Ei4e1"
   },
   "source": [
    "## 模型保存"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "FyUy4VDci4e1"
   },
   "source": [
    "## 模型导入"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "eve9hwqti4e2"
   },
   "source": [
    "# OpenCV学习"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "9cKjwsX_i4e2"
   },
   "source": [
    "## 库导入"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "phxQ3Ghzi4e2"
   },
   "source": [
    "## 图片打开"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Tc6nr4T7i4e3"
   },
   "source": [
    "## 图片保存"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "_hYrErDbi4e4"
   },
   "source": [
    "## 图片处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "sOJr87Kxi4e4"
   },
   "source": [
    "## 图片显示"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "9CQSKMYXi4e5"
   },
   "source": [
    "# Image学习"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "dxjdVclWi4e6"
   },
   "source": [
    "# numpy学习"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "qkoN150xi4e6"
   },
   "source": [
    "## 库导入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "CyMe7EMUi4e8"
   },
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "PMFLE2Mbi4e9"
   },
   "source": [
    "## 基础操作"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "G4o0GaUSi4fA"
   },
   "source": [
    "### 数据建立"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "W1h_D3zii4fB"
   },
   "outputs": [],
   "source": [
    "nm = np.array([[1, 4, 5], [3, 6, 9]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "b2c1Ezudi4fD",
    "outputId": "8948bc62-1ce7-4442-e9d9-00d4f232d0fa"
   },
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "'numpy.ndarray' object has no attribute 'type'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-61-919aaaf178ce>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mnm\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mAttributeError\u001b[0m: 'numpy.ndarray' object has no attribute 'type'"
     ]
    }
   ],
   "source": [
    "nm.type()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "-CL1b3GWi4fF",
    "outputId": "6c85f9de-8812-4a97-9b25-6663212deee6"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 3)"
      ]
     },
     "execution_count": 26,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nm.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "lB0xJDGSi4fG"
   },
   "source": [
    "### 取最值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "2sXFFiEAi4fH"
   },
   "outputs": [],
   "source": [
    "np.max(nm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "6J5uhBPbi4fJ"
   },
   "outputs": [],
   "source": [
    "np.min(nm)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "8Ijk71_FoWpb"
   },
   "source": [
    "# tensorboard"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from tensorboardX import SummaryWriter\n",
    "\n",
    "# 文件默认到runs目录 ， comment为子目录的后缀\n",
    "# 加了log_dir后，保存到log_dir目录内\n",
    "writer = SummaryWriter(log_dir='logs',comment='epoch')\n",
    "for epoch in range(10):\n",
    "    writer.add_scalar('log', np.random.rand(), epoch)\n",
    "#     writer.add_scalar('log/sca_test', {'xsinx': epoch * np.sin(epoch), 'xcosx': epoch * np.cos(epoch)}, epoch)\n",
    "\n",
    "writer.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on class SummaryWriter in module tensorboardX.writer:\n",
      "\n",
      "class SummaryWriter(builtins.object)\n",
      " |  SummaryWriter(logdir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='', write_to_disk=True, log_dir=None, **kwargs)\n",
      " |  \n",
      " |  Writes entries directly to event files in the logdir to be\n",
      " |  consumed by TensorBoard.\n",
      " |  \n",
      " |  The `SummaryWriter` class provides a high-level API to create an event file\n",
      " |  in a given directory and add summaries and events to it. The class updates the\n",
      " |  file contents asynchronously. This allows a training program to call methods\n",
      " |  to add data to the file directly from the training loop, without slowing down\n",
      " |  training.\n",
      " |  \n",
      " |  Methods defined here:\n",
      " |  \n",
      " |  __enter__(self)\n",
      " |  \n",
      " |  __exit__(self, exc_type, exc_val, exc_tb)\n",
      " |  \n",
      " |  __init__(self, logdir=None, comment='', purge_step=None, max_queue=10, flush_secs=120, filename_suffix='', write_to_disk=True, log_dir=None, **kwargs)\n",
      " |      Creates a `SummaryWriter` that will write out events and summaries\n",
      " |      to the event file.\n",
      " |      \n",
      " |      Args:\n",
      " |          logdir (string): Save directory location. Default is\n",
      " |            runs/**CURRENT_DATETIME_HOSTNAME**, which changes after each run.\n",
      " |            Use hierarchical folder structure to compare\n",
      " |            between runs easily. e.g. pass in 'runs/exp1', 'runs/exp2', etc.\n",
      " |            for each new experiment to compare across them.\n",
      " |          comment (string): Comment logdir suffix appended to the default\n",
      " |            ``logdir``. If ``logdir`` is assigned, this argument has no effect.\n",
      " |          purge_step (int):\n",
      " |            When logging crashes at step :math:`T+X` and restarts at step :math:`T`,\n",
      " |            any events whose global_step larger or equal to :math:`T` will be\n",
      " |            purged and hidden from TensorBoard.\n",
      " |            Note that crashed and resumed experiments should have the same ``logdir``.\n",
      " |          max_queue (int): Size of the queue for pending events and\n",
      " |            summaries before one of the 'add' calls forces a flush to disk.\n",
      " |            Default is ten items.\n",
      " |          flush_secs (int): How often, in seconds, to flush the\n",
      " |            pending events and summaries to disk. Default is every two minutes.\n",
      " |          filename_suffix (string): Suffix added to all event filenames in\n",
      " |            the logdir directory. More details on filename construction in\n",
      " |            tensorboard.summary.writer.event_file_writer.EventFileWriter.\n",
      " |          write_to_disk (boolean):\n",
      " |            If pass `False`, SummaryWriter will not write to disk.\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          from tensorboardX import SummaryWriter\n",
      " |      \n",
      " |          # create a summary writer with automatically generated folder name.\n",
      " |          writer = SummaryWriter()\n",
      " |          # folder location: runs/May04_22-14-54_s-MacBook-Pro.local/\n",
      " |      \n",
      " |          # create a summary writer using the specified folder name.\n",
      " |          writer = SummaryWriter(\"my_experiment\")\n",
      " |          # folder location: my_experiment\n",
      " |      \n",
      " |          # create a summary writer with comment appended.\n",
      " |          writer = SummaryWriter(comment=\"LR_0.1_BATCH_16\")\n",
      " |          # folder location: runs/May04_22-14-54_s-MacBook-Pro.localLR_0.1_BATCH_16/\n",
      " |  \n",
      " |  add_audio(self, tag, snd_tensor, global_step=None, sample_rate=44100, walltime=None)\n",
      " |      Add audio data to summary.\n",
      " |      \n",
      " |      Args:\n",
      " |          tag (string): Data identifier\n",
      " |          snd_tensor (torch.Tensor): Sound data\n",
      " |          global_step (int): Global step value to record\n",
      " |          sample_rate (int): sample rate in Hz\n",
      " |          walltime (float): Optional override default walltime (time.time()) of event\n",
      " |      Shape:\n",
      " |          snd_tensor: :math:`(1, L)`. The values should lie between [-1, 1].\n",
      " |  \n",
      " |  add_custom_scalars(self, layout)\n",
      " |      Create special chart by collecting charts tags in 'scalars'. Note that this function can only be called once\n",
      " |      for each SummaryWriter() object. Because it only provides metadata to tensorboard, the function can be called\n",
      " |      before or after the training loop. See ``examples/demo_custom_scalars.py`` for more.\n",
      " |      \n",
      " |      Args:\n",
      " |          layout (dict): {categoryName: *charts*}, where *charts* is also a dictionary\n",
      " |            {chartName: *ListOfProperties*}. The first element in *ListOfProperties* is the chart's type\n",
      " |            (one of **Multiline** or **Margin**) and the second element should be a list containing the tags\n",
      " |            you have used in add_scalar function, which will be collected into the new chart.\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          layout = {'Taiwan':{'twse':['Multiline',['twse/0050', 'twse/2330']]},\n",
      " |                       'USA':{ 'dow':['Margin',   ['dow/aaa', 'dow/bbb', 'dow/ccc']],\n",
      " |                            'nasdaq':['Margin',   ['nasdaq/aaa', 'nasdaq/bbb', 'nasdaq/ccc']]}}\n",
      " |      \n",
      " |          writer.add_custom_scalars(layout)\n",
      " |  \n",
      " |  add_custom_scalars_marginchart(self, tags, category='default', title='untitled')\n",
      " |      Shorthand for creating marginchart. Similar to ``add_custom_scalars()``, but the only necessary argument\n",
      " |      is *tags*, which should have exactly 3 elements.\n",
      " |      \n",
      " |      Args:\n",
      " |          tags (list): list of tags that have been used in ``add_scalar()``\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          writer.add_custom_scalars_marginchart(['twse/0050', 'twse/2330', 'twse/2006'])\n",
      " |  \n",
      " |  add_custom_scalars_multilinechart(self, tags, category='default', title='untitled')\n",
      " |      Shorthand for creating multilinechart. Similar to ``add_custom_scalars()``, but the only necessary argument\n",
      " |      is *tags*.\n",
      " |      \n",
      " |      Args:\n",
      " |          tags (list): list of tags that have been used in ``add_scalar()``\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          writer.add_custom_scalars_multilinechart(['twse/0050', 'twse/2330'])\n",
      " |  \n",
      " |  add_embedding(self, mat, metadata=None, label_img=None, global_step=None, tag='default', metadata_header=None)\n",
      " |      Add embedding projector data to summary.\n",
      " |      \n",
      " |      Args:\n",
      " |          mat (torch.Tensor or numpy.array): A matrix which each row is the feature vector of the data point\n",
      " |          metadata (list): A list of labels, each element will be convert to string\n",
      " |          label_img (torch.Tensor or numpy.array): Images correspond to each data point. Each image should\n",
      " |              be square. The amount and size of the images are limited by the Tensorboard frontend,\n",
      " |              see limits below.\n",
      " |          global_step (int): Global step value to record\n",
      " |          tag (string): Name for the embedding\n",
      " |      Shape:\n",
      " |          mat: :math:`(N, D)`, where N is number of data and D is feature dimension\n",
      " |      \n",
      " |          label_img: :math:`(N, C, H, W)`, where `Height` should be equal to `Width`.\n",
      " |          Also, :math:`\\sqrt{N}*W` must be less than or equal to 8192, so that the generated sprite\n",
      " |          image can be loaded by the Tensorboard frontend\n",
      " |          (see `tensorboardX#516 <https://github.com/lanpa/tensorboardX/issues/516>`_ for more).\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          import keyword\n",
      " |          import torch\n",
      " |          meta = []\n",
      " |          while len(meta)<100:\n",
      " |              meta = meta+keyword.kwlist # get some strings\n",
      " |          meta = meta[:100]\n",
      " |      \n",
      " |          for i, v in enumerate(meta):\n",
      " |              meta[i] = v+str(i)\n",
      " |      \n",
      " |          label_img = torch.rand(100, 3, 32, 32)\n",
      " |          for i in range(100):\n",
      " |              label_img[i]*=i/100.0\n",
      " |      \n",
      " |          writer.add_embedding(torch.randn(100, 5), metadata=meta, label_img=label_img)\n",
      " |          writer.add_embedding(torch.randn(100, 5), label_img=label_img)\n",
      " |          writer.add_embedding(torch.randn(100, 5), metadata=meta)\n",
      " |  \n",
      " |  add_figure(self, tag, figure, global_step=None, close=True, walltime=None)\n",
      " |      Render matplotlib figure into an image and add it to summary.\n",
      " |      \n",
      " |      Note that this requires the ``matplotlib`` package.\n",
      " |      \n",
      " |      Args:\n",
      " |          tag (string): Data identifier\n",
      " |          figure (matplotlib.pyplot.figure) or list of figures: Figure or a list of figures\n",
      " |          global_step (int): Global step value to record\n",
      " |          close (bool): Flag to automatically close the figure\n",
      " |          walltime (float): Optional override default walltime (time.time()) of event\n",
      " |  \n",
      " |  add_graph(self, model, input_to_model=None, verbose=False, profile_with_cuda=False, **kwargs)\n",
      " |      Add graph data to summary.\n",
      " |      \n",
      " |      Args:\n",
      " |          model (torch.nn.Module): Model to draw.\n",
      " |          input_to_model (torch.Tensor or list of torch.Tensor): A variable or a tuple of\n",
      " |              variables to be fed.\n",
      " |          verbose (bool): Whether to print graph structure in console.\n",
      " |          omit_useless_nodes (bool): Default to ``true``, which eliminates unused nodes.\n",
      " |          operator_export_type (string): One of: ``\"ONNX\"``, ``\"RAW\"``. This determines\n",
      " |              the optimization level of the graph. If error happens during exporting\n",
      " |              the graph, using ``\"RAW\"`` might help.\n",
      " |  \n",
      " |  add_histogram(self, tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None)\n",
      " |      Add histogram to summary.\n",
      " |      \n",
      " |      Args:\n",
      " |          tag (string): Data identifier\n",
      " |          values (torch.Tensor, numpy.array, or string/blobname): Values to build histogram\n",
      " |          global_step (int): Global step value to record\n",
      " |          bins (string): One of {'tensorflow','auto', 'fd', ...}. This determines how the bins are made. You can find\n",
      " |            other options in: https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html\n",
      " |          walltime (float): Optional override default walltime (time.time()) of event\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          from tensorboardX import SummaryWriter\n",
      " |          import numpy as np\n",
      " |          writer = SummaryWriter()\n",
      " |          for i in range(10):\n",
      " |              x = np.random.random(1000)\n",
      " |              writer.add_histogram('distribution centers', x + i, i)\n",
      " |          writer.close()\n",
      " |      \n",
      " |      Expected result:\n",
      " |      \n",
      " |      .. image:: _static/img/tensorboard/add_histogram.png\n",
      " |         :scale: 50 %\n",
      " |  \n",
      " |  add_histogram_raw(self, tag, min, max, num, sum, sum_squares, bucket_limits, bucket_counts, global_step=None, walltime=None)\n",
      " |      Adds histogram with raw data.\n",
      " |      \n",
      " |      Args:\n",
      " |          tag (string): Data identifier\n",
      " |          min (float or int): Min value\n",
      " |          max (float or int): Max value\n",
      " |          num (int): Number of values\n",
      " |          sum (float or int): Sum of all values\n",
      " |          sum_squares (float or int): Sum of squares for all values\n",
      " |          bucket_limits (torch.Tensor, numpy.array): Upper value per\n",
      " |            bucket, note that the bucket_limits returned from `np.histogram`\n",
      " |            has one more element. See the comment in the following example.\n",
      " |          bucket_counts (torch.Tensor, numpy.array): Number of values per bucket\n",
      " |          global_step (int): Global step value to record\n",
      " |          walltime (float): Optional override default walltime (time.time()) of event\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          import numpy as np\n",
      " |          dummy_data = []\n",
      " |          for idx, value in enumerate(range(30)):\n",
      " |              dummy_data += [idx + 0.001] * value\n",
      " |          values = np.array(dummy_data).astype(float).reshape(-1)\n",
      " |          counts, limits = np.histogram(values)\n",
      " |          sum_sq = values.dot(values)\n",
      " |          with SummaryWriter() as summary_writer:\n",
      " |              summary_writer.add_histogram_raw(\n",
      " |                      tag='hist_dummy_data',\n",
      " |                      min=values.min(),\n",
      " |                      max=values.max(),\n",
      " |                      num=len(values),\n",
      " |                      sum=values.sum(),\n",
      " |                      sum_squares=sum_sq,\n",
      " |                      bucket_limits=limits[1:].tolist(),  # <- note here.\n",
      " |                      bucket_counts=counts.tolist(),\n",
      " |                      global_step=0)\n",
      " |  \n",
      " |  add_hparams(self, hparam_dict=None, metric_dict=None, name=None, global_step=None)\n",
      " |      Add a set of hyperparameters to be compared in tensorboard.\n",
      " |      \n",
      " |      Args:\n",
      " |          hparam_dict (dictionary): Each key-value pair in the dictionary is the\n",
      " |            name of the hyper parameter and it's corresponding value.\n",
      " |          metric_dict (dictionary): Each key-value pair in the dictionary is the\n",
      " |            name of the metric and it's corresponding value. Note that the key used\n",
      " |            here should be unique in the tensorboard record. Otherwise the value\n",
      " |            you added by `add_scalar` will be displayed in hparam plugin. In most\n",
      " |            cases, this is unwanted.\n",
      " |          name (string): Personnalised name of the hparam session\n",
      " |          global_step (int): Current time step\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          from tensorboardX import SummaryWriter\n",
      " |          with SummaryWriter() as w:\n",
      " |              for i in range(5):\n",
      " |                  w.add_hparams({'lr': 0.1*i, 'bsize': i},\n",
      " |                                {'hparam/accuracy': 10*i, 'hparam/loss': 10*i})\n",
      " |      \n",
      " |      Expected result:\n",
      " |      \n",
      " |      .. image:: _static/img/tensorboard/add_hparam.png\n",
      " |         :scale: 50 %\n",
      " |  \n",
      " |  add_image(self, tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')\n",
      " |      Add image data to summary.\n",
      " |      \n",
      " |      Note that this requires the ``pillow`` package.\n",
      " |      \n",
      " |      Args:\n",
      " |          tag (string): Data identifier\n",
      " |          img_tensor (torch.Tensor, numpy.array, or string/blobname): An `uint8` or `float`\n",
      " |              Tensor of shape `[channel, height, width]` where `channel` is 1, 3, or 4.\n",
      " |              The elements in img_tensor can either have values in [0, 1] (float32) or [0, 255] (uint8).\n",
      " |              Users are responsible to scale the data in the correct range/type.\n",
      " |          global_step (int): Global step value to record\n",
      " |          walltime (float): Optional override default walltime (time.time()) of event.\n",
      " |          dataformats (string): This parameter specifies the meaning of each dimension of the input tensor.\n",
      " |      Shape:\n",
      " |          img_tensor: Default is :math:`(3, H, W)`. You can use ``torchvision.utils.make_grid()`` to\n",
      " |          convert a batch of tensor into 3xHxW format or use ``add_images()`` and let us do the job.\n",
      " |          Tensor with :math:`(1, H, W)`, :math:`(H, W)`, :math:`(H, W, 3)` is also suitible as long as\n",
      " |          corresponding ``dataformats`` argument is passed. e.g. CHW, HWC, HW.\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          from tensorboardX import SummaryWriter\n",
      " |          import numpy as np\n",
      " |          img = np.zeros((3, 100, 100))\n",
      " |          img[0] = np.arange(0, 10000).reshape(100, 100) / 10000\n",
      " |          img[1] = 1 - np.arange(0, 10000).reshape(100, 100) / 10000\n",
      " |      \n",
      " |          img_HWC = np.zeros((100, 100, 3))\n",
      " |          img_HWC[:, :, 0] = np.arange(0, 10000).reshape(100, 100) / 10000\n",
      " |          img_HWC[:, :, 1] = 1 - np.arange(0, 10000).reshape(100, 100) / 10000\n",
      " |      \n",
      " |          writer = SummaryWriter()\n",
      " |          writer.add_image('my_image', img, 0)\n",
      " |      \n",
      " |          # If you have non-default dimension setting, set the dataformats argument.\n",
      " |          writer.add_image('my_image_HWC', img_HWC, 0, dataformats='HWC')\n",
      " |          writer.close()\n",
      " |      \n",
      " |      Expected result:\n",
      " |      \n",
      " |      .. image:: _static/img/tensorboard/add_image.png\n",
      " |         :scale: 50 %\n",
      " |  \n",
      " |  add_image_with_boxes(self, tag, img_tensor, box_tensor, global_step=None, walltime=None, dataformats='CHW', labels=None, **kwargs)\n",
      " |      Add image and draw bounding boxes on the image.\n",
      " |      \n",
      " |      Args:\n",
      " |          tag (string): Data identifier\n",
      " |          img_tensor (torch.Tensor, numpy.array, or string/blobname): Image data\n",
      " |          box_tensor (torch.Tensor, numpy.array, or string/blobname): Box data (for detected objects)\n",
      " |            box should be represented as [x1, y1, x2, y2].\n",
      " |          global_step (int): Global step value to record\n",
      " |          walltime (float): Optional override default walltime (time.time()) of event\n",
      " |          labels (list of string): The strings to be show on each bounding box.\n",
      " |      Shape:\n",
      " |          img_tensor: Default is :math:`(3, H, W)`. It can be specified with ``dataformats`` argument.\n",
      " |          e.g. CHW or HWC\n",
      " |      \n",
      " |          box_tensor: (torch.Tensor, numpy.array, or string/blobname): NX4,  where N is the number of\n",
      " |          boxes and each 4 elememts in a row represents (xmin, ymin, xmax, ymax).\n",
      " |  \n",
      " |  add_images(self, tag, img_tensor, global_step=None, walltime=None, dataformats='NCHW')\n",
      " |      Add batched (4D) image data to summary.\n",
      " |      Besides passing 4D (NCHW) tensor, you can also pass a list of tensors of the same size.\n",
      " |      In this case, the ``dataformats`` should be `CHW` or `HWC`.\n",
      " |      Note that this requires the ``pillow`` package.\n",
      " |      \n",
      " |      Args:\n",
      " |          tag (string): Data identifier\n",
      " |          img_tensor (torch.Tensor, numpy.array, or string/blobname): Image data\n",
      " |              The elements in img_tensor can either have values in [0, 1] (float32) or [0, 255] (uint8).\n",
      " |              Users are responsible to scale the data in the correct range/type.\n",
      " |          global_step (int): Global step value to record\n",
      " |          walltime (float): Optional override default walltime (time.time()) of event\n",
      " |      Shape:\n",
      " |          img_tensor: Default is :math:`(N, 3, H, W)`. If ``dataformats`` is specified, other shape will be\n",
      " |          accepted. e.g. NCHW or NHWC.\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          from tensorboardX import SummaryWriter\n",
      " |          import numpy as np\n",
      " |      \n",
      " |          img_batch = np.zeros((16, 3, 100, 100))\n",
      " |          for i in range(16):\n",
      " |              img_batch[i, 0] = np.arange(0, 10000).reshape(100, 100) / 10000 / 16 * i\n",
      " |              img_batch[i, 1] = (1 - np.arange(0, 10000).reshape(100, 100) / 10000) / 16 * i\n",
      " |      \n",
      " |          writer = SummaryWriter()\n",
      " |          writer.add_images('my_image_batch', img_batch, 0)\n",
      " |          writer.close()\n",
      " |      \n",
      " |      Expected result:\n",
      " |      \n",
      " |      .. image:: _static/img/tensorboard/add_images.png\n",
      " |         :scale: 30 %\n",
      " |  \n",
      " |  add_mesh(self, tag, vertices, colors=None, faces=None, config_dict=None, global_step=None, walltime=None)\n",
      " |      Add meshes or 3D point clouds to TensorBoard. The visualization is based on Three.js,\n",
      " |      so it allows users to interact with the rendered object. Besides the basic definitions\n",
      " |      such as vertices, faces, users can further provide camera parameter, lighting condition, etc.\n",
      " |      Please check https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene for\n",
      " |      advanced usage. Note that currently this depends on tb-nightly to show.\n",
      " |      \n",
      " |      Args:\n",
      " |          tag (string): Data identifier\n",
      " |          vertices (torch.Tensor): List of the 3D coordinates of vertices.\n",
      " |          colors (torch.Tensor): Colors for each vertex\n",
      " |          faces (torch.Tensor): Indices of vertices within each triangle. (Optional)\n",
      " |          config_dict: Dictionary with ThreeJS classes names and configuration.\n",
      " |          global_step (int): Global step value to record\n",
      " |          walltime (float): Optional override default walltime (time.time())\n",
      " |            seconds after epoch of event\n",
      " |      \n",
      " |      Shape:\n",
      " |          vertices: :math:`(B, N, 3)`. (batch, number_of_vertices, channels). If you see nothing on\n",
      " |            tensorboard, try normalizing the values to [-1, 1].\n",
      " |      \n",
      " |          colors: :math:`(B, N, 3)`. The values should lie in [0, 255].\n",
      " |      \n",
      " |          faces: :math:`(B, N, 3)`. The values should lie in [0, number_of_vertices] for type `uint8`.\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          from tensorboardX import SummaryWriter\n",
      " |          vertices_tensor = np.array([[\n",
      " |              [1, 1, 1],\n",
      " |              [-1, -1, 1],\n",
      " |              [1, -1, -1],\n",
      " |              [-1, 1, -1],\n",
      " |          ]], dtype=float)\n",
      " |          colors_tensor = np.array([[\n",
      " |              [255, 0, 0],\n",
      " |              [0, 255, 0],\n",
      " |              [0, 0, 255],\n",
      " |              [255, 0, 255],\n",
      " |          ]], dtype=int)\n",
      " |          faces_tensor = np.array([[\n",
      " |              [0, 2, 3],\n",
      " |              [0, 3, 1],\n",
      " |              [0, 1, 2],\n",
      " |              [1, 3, 2],\n",
      " |          ]], dtype=int)\n",
      " |      \n",
      " |          writer = SummaryWriter()\n",
      " |          writer.add_mesh('my_mesh', vertices=vertices_tensor, colors=colors_tensor, faces=faces_tensor)\n",
      " |      \n",
      " |          writer.close()\n",
      " |  \n",
      " |  add_onnx_graph(self, onnx_model_file)\n",
      " |      Add onnx graph to TensorBoard.\n",
      " |      \n",
      " |      Args:\n",
      " |          onnx_model_file (string): The path to the onnx model.\n",
      " |  \n",
      " |  add_openvino_graph(self, xmlname)\n",
      " |      Add openvino graph to TensorBoard.\n",
      " |      \n",
      " |      Args:\n",
      " |          xmlname (string): The path to the openvino model. (the xml file)\n",
      " |  \n",
      " |  add_pr_curve(self, tag, labels, predictions, global_step=None, num_thresholds=127, weights=None, walltime=None)\n",
      " |      Adds precision recall curve.\n",
      " |      Plotting a precision-recall curve lets you understand your model's\n",
      " |      performance under different threshold settings. With this function,\n",
      " |      you provide the ground truth labeling (T/F) and prediction confidence\n",
      " |      (usually the output of your model) for each target. The TensorBoard UI\n",
      " |      will let you choose the threshold interactively.\n",
      " |      \n",
      " |      Args:\n",
      " |          tag (string): Data identifier\n",
      " |          labels (torch.Tensor, numpy.array, or string/blobname):\n",
      " |            Ground truth data. Binary label for each element.\n",
      " |          predictions (torch.Tensor, numpy.array, or string/blobname):\n",
      " |            The probability that an element be classified as true.\n",
      " |            Value should in [0, 1]\n",
      " |          global_step (int): Global step value to record\n",
      " |          num_thresholds (int): Number of thresholds used to draw the curve.\n",
      " |          walltime (float): Optional override default walltime (time.time()) of event\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          from tensorboardX import SummaryWriter\n",
      " |          import numpy as np\n",
      " |          labels = np.random.randint(2, size=100)  # binary label\n",
      " |          predictions = np.random.rand(100)\n",
      " |          writer = SummaryWriter()\n",
      " |          writer.add_pr_curve('pr_curve', labels, predictions, 0)\n",
      " |          writer.close()\n",
      " |  \n",
      " |  add_pr_curve_raw(self, tag, true_positive_counts, false_positive_counts, true_negative_counts, false_negative_counts, precision, recall, global_step=None, num_thresholds=127, weights=None, walltime=None)\n",
      " |      Adds precision recall curve with raw data.\n",
      " |      \n",
      " |      Args:\n",
      " |          tag (string): Data identifier\n",
      " |          true_positive_counts (torch.Tensor, numpy.array, or string/blobname): true positive counts\n",
      " |          false_positive_counts (torch.Tensor, numpy.array, or string/blobname): false positive counts\n",
      " |          true_negative_counts (torch.Tensor, numpy.array, or string/blobname): true negative counts\n",
      " |          false_negative_counts (torch.Tensor, numpy.array, or string/blobname): false negative counts\n",
      " |          precision (torch.Tensor, numpy.array, or string/blobname): precision\n",
      " |          recall (torch.Tensor, numpy.array, or string/blobname): recall\n",
      " |          global_step (int): Global step value to record\n",
      " |          num_thresholds (int): Number of thresholds used to draw the curve.\n",
      " |          walltime (float): Optional override default walltime (time.time()) of event\n",
      " |          see: https://github.com/tensorflow/tensorboard/blob/master/tensorboard/plugins/pr_curve/README.md\n",
      " |  \n",
      " |  add_scalar(self, tag, scalar_value, global_step=None, walltime=None)\n",
      " |      Add scalar data to summary.\n",
      " |      \n",
      " |      Args:\n",
      " |          tag (string): Data identifier\n",
      " |          scalar_value (float or string/blobname): Value to save\n",
      " |          global_step (int): Global step value to record\n",
      " |          walltime (float): Optional override default walltime (time.time()) of event\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          from tensorboardX import SummaryWriter\n",
      " |          writer = SummaryWriter()\n",
      " |          x = range(100)\n",
      " |          for i in x:\n",
      " |              writer.add_scalar('y=2x', i * 2, i)\n",
      " |          writer.close()\n",
      " |      \n",
      " |      Expected result:\n",
      " |      \n",
      " |      .. image:: _static/img/tensorboard/add_scalar.png\n",
      " |         :scale: 50 %\n",
      " |  \n",
      " |  add_scalars(self, main_tag, tag_scalar_dict, global_step=None, walltime=None)\n",
      " |      Adds many scalar data to summary.\n",
      " |      \n",
      " |      Note that this function also keeps logged scalars in memory. In extreme case it explodes your RAM.\n",
      " |      \n",
      " |      Args:\n",
      " |          main_tag (string): The parent name for the tags\n",
      " |          tag_scalar_dict (dict): Key-value pair storing the tag and corresponding values\n",
      " |          global_step (int): Global step value to record\n",
      " |          walltime (float): Optional override default walltime (time.time()) of event\n",
      " |      \n",
      " |      Examples::\n",
      " |      \n",
      " |          from tensorboardX import SummaryWriter\n",
      " |          writer = SummaryWriter()\n",
      " |          r = 5\n",
      " |          for i in range(100):\n",
      " |              writer.add_scalars('run_14h', {'xsinx':i*np.sin(i/r),\n",
      " |                                              'xcosx':i*np.cos(i/r),\n",
      " |                                              'tanx': np.tan(i/r)}, i)\n",
      " |          writer.close()\n",
      " |          # This call adds three values to the same scalar plot with the tag\n",
      " |          # 'run_14h' in TensorBoard's scalar section.\n",
      " |      \n",
      " |      Expected result:\n",
      " |      \n",
      " |      .. image:: _static/img/tensorboard/add_scalars.png\n",
      " |         :scale: 50 %\n",
      " |  \n",
      " |  add_text(self, tag, text_string, global_step=None, walltime=None)\n",
      " |      Add text data to summary.\n",
      " |      \n",
      " |      Args:\n",
      " |          tag (string): Data identifier\n",
      " |          text_string (string): String to save\n",
      " |          global_step (int): Global step value to record\n",
      " |          walltime (float): Optional override default walltime (time.time()) of event\n",
      " |      Examples::\n",
      " |      \n",
      " |          writer.add_text('lstm', 'This is an lstm', 0)\n",
      " |          writer.add_text('rnn', 'This is an rnn', 10)\n",
      " |  \n",
      " |  add_video(self, tag, vid_tensor, global_step=None, fps=4, walltime=None)\n",
      " |      Add video data to summary.\n",
      " |      \n",
      " |      Note that this requires the ``moviepy`` package.\n",
      " |      \n",
      " |      Args:\n",
      " |          tag (string): Data identifier\n",
      " |          vid_tensor (torch.Tensor): Video data\n",
      " |          global_step (int): Global step value to record\n",
      " |          fps (float or int): Frames per second\n",
      " |          walltime (float): Optional override default walltime (time.time()) of event\n",
      " |      Shape:\n",
      " |          vid_tensor: :math:`(N, T, C, H, W)`. The values should lie in [0, 255] for type\n",
      " |            `uint8` or [0, 1] for type `float`.\n",
      " |  \n",
      " |  close(self)\n",
      " |      Close the current SummaryWriter. This call flushes the unfinished write operation.\n",
      " |      Use context manager (with statement) whenever it's possible.\n",
      " |  \n",
      " |  export_scalars_to_json(self, path)\n",
      " |      Exports to the given path an ASCII file containing all the scalars written\n",
      " |      so far by this instance, with the following format:\n",
      " |      {writer_id : [[timestamp, step, value], ...], ...}\n",
      " |      \n",
      " |      The scalars saved by ``add_scalars()`` will be flushed after export.\n",
      " |  \n",
      " |  flush(self)\n",
      " |      Force the data in memory to be flushed to disk. Use this call if tensorboard does not update reqularly.\n",
      " |      Another way is to set the `flush_secs` when creating the SummaryWriter.\n",
      " |  \n",
      " |  ----------------------------------------------------------------------\n",
      " |  Data descriptors defined here:\n",
      " |  \n",
      " |  __dict__\n",
      " |      dictionary for instance variables (if defined)\n",
      " |  \n",
      " |  __weakref__\n",
      " |      list of weak references to the object (if defined)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(SummaryWriter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple\n",
      "Requirement already satisfied: tensorboardX in e:\\soft\\anaconda3\\envs\\test\\lib\\site-packages (2.0)\n",
      "Requirement already satisfied: protobuf>=3.8.0 in e:\\soft\\anaconda3\\envs\\test\\lib\\site-packages (from tensorboardX) (3.11.3)\n",
      "Requirement already satisfied: six in e:\\soft\\anaconda3\\envs\\test\\lib\\site-packages (from tensorboardX) (1.14.0)\n",
      "Requirement already satisfied: numpy in e:\\soft\\anaconda3\\envs\\test\\lib\\site-packages (from tensorboardX) (1.18.1)\n",
      "Requirement already satisfied: setuptools in e:\\soft\\anaconda3\\envs\\test\\lib\\site-packages (from protobuf>=3.8.0->tensorboardX) (45.2.0.post20200209)\n"
     ]
    }
   ],
   "source": [
    "!pip install tensorboardX"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'past'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-10-54e390d674f8>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m     35\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mSummaryWriter\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlog_dir\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"log2\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcomment\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"Net\"\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mw\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     36\u001b[0m     \u001b[1;31m#        模型     输入数据（元组形式）\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 37\u001b[1;33m     \u001b[0mw\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd_graph\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mFPN50\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0minputm\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32mE:\\Soft\\anaconda\\envs\\retinanet\\lib\\site-packages\\tensorboardX\\writer.py\u001b[0m in \u001b[0;36madd_graph\u001b[1;34m(self, model, input_to_model, verbose, profile_with_cuda, **kwargs)\u001b[0m\n\u001b[0;32m    806\u001b[0m             \u001b[1;31m# Caffe2 models do not have the 'forward' method\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    807\u001b[0m             \u001b[1;32mfrom\u001b[0m \u001b[0mcaffe2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mproto\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mcaffe2_pb2\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 808\u001b[1;33m             \u001b[1;32mfrom\u001b[0m \u001b[0mcaffe2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpython\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mcore\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    809\u001b[0m             from .caffe2_graph import (\n\u001b[0;32m    810\u001b[0m                 \u001b[0mmodel_to_graph_def\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnets_to_graph_def\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mprotos_to_graph_def\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mE:\\Soft\\anaconda\\envs\\retinanet\\lib\\site-packages\\caffe2\\python\\core.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      7\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      8\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mcollections\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnamedtuple\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mOrderedDict\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdefaultdict\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 9\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mpast\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbuiltins\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mbasestring\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     10\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mfuture\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mutils\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mviewitems\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mviewkeys\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mviewvalues\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     11\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mitertools\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mchain\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'past'"
     ]
    }
   ],
   "source": [
    "class Net(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Net,self).__init__()\n",
    "        self.features = nn.Sequential(\n",
    "            nn.Conv2d(3, 3, 3,  padding=1)\n",
    "        )\n",
    "        \n",
    "        self.conv1 = nn.Conv2d(3,6,5)\n",
    "        self.pool = nn.MaxPool2d(2,2)\n",
    "        self.conv2 = nn.Conv2d(6,16,5)\n",
    "        self.fc1 = nn.Linear(16 * 18 * 18,800)\n",
    "        self.fc2 = nn.Linear(800,120)\n",
    "        self.fc3 = nn.Linear(120,54)\n",
    "#         self.conv3 = D3_Conv((3, 3, 3))\n",
    "        \n",
    "#         self.ca = ChannelAttention(16)\n",
    "#         self.sq = SpatialAttention()\n",
    "        \n",
    "    def forward(self,x):\n",
    "#         x = self.conv3(x)\n",
    "        x = self.features(x)\n",
    "#         x = self.sq(x) * x\n",
    "        x = self.pool(F.relu(self.conv1(x)))\n",
    "        x = self.pool(F.relu(self.conv2(x)))\n",
    "#         x = x * self.ca(x)\n",
    "        x = x.view(-1,16 * 18 * 18)\n",
    "        x = F.relu(self.fc1(x))\n",
    "        x = F.relu(self.fc2(x))\n",
    "        x = self.fc3(x)\n",
    "        \n",
    "        return x\n",
    "    \n",
    "inputm = torch.rand(13, 3, 224, 224)\n",
    "\n",
    "with SummaryWriter(log_dir=\"log2\", comment=\"Net\") as w:\n",
    "    #        模型     输入数据（元组形式）\n",
    "    w.add_graph(FPN50, (inputm, ))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 1, 1]\n",
      "[2, 1, 1, 1]\n",
      "[2, 1, 1, 1, 1, 1]\n",
      "[2, 1, 1]\n",
      "len fms =  5\n",
      "len fms =  5\n",
      "len fms =  5\n",
      "len fms =  5\n"
     ]
    }
   ],
   "source": [
    "import torchvision\n",
    "\n",
    "model = RetinaNet()\n",
    "\n",
    "inputm = torch.rand(13, 3, 224, 224)\n",
    "\n",
    "with SummaryWriter(log_dir=\"logmodel\", comment=\"Net\") as w:\n",
    "    #        模型     输入数据（元组形式）\n",
    "    w.add_graph(model, (inputm, ))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lime模型可解释性查看"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "导入图片"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x1964c6dbc88>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def get_image(path):\n",
    "    with open(os.path.abspath(path), 'rb') as f:\n",
    "        with Image.open(f) as img:\n",
    "            return img.convert('RGB') \n",
    "        \n",
    "img = get_image('./data/dogs.png')\n",
    "plt.imshow(img)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "转换数据以便于模型输入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# resize and take the center part of image to what our model expects\n",
    "def get_input_transform():\n",
    "    normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],\n",
    "                                    std=[0.229, 0.224, 0.225])       \n",
    "    transf = transforms.Compose([\n",
    "        transforms.Resize((256, 256)),\n",
    "        transforms.CenterCrop(224),\n",
    "        transforms.ToTensor(),\n",
    "        normalize\n",
    "    ])    \n",
    "\n",
    "    return transf\n",
    "\n",
    "def get_input_tensors(img):\n",
    "    transf = get_input_transform()\n",
    "    # unsqeeze converts single image to batch of 1\n",
    "    return transf(img).unsqueeze(0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "定义模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = models.inception_v3(pretrained=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "idx2label, cls2label, cls2idx = [], {}, {}\n",
    "with open(os.path.abspath('./data/imagenet_class_index.json'), 'r') as read_file:\n",
    "    class_idx = json.load(read_file)\n",
    "    idx2label = [class_idx[str(k)][1] for k in range(len(class_idx))]\n",
    "    cls2label = {class_idx[str(k)][0]: class_idx[str(k)][1] for k in range(len(class_idx))}\n",
    "    cls2idx = {class_idx[str(k)][0]: k for k in range(len(class_idx))}    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "获取模型的输出"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "img_t = get_input_tensors(img)\n",
    "model.eval()\n",
    "logits = model(img_t)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们得到的预测是对数。 让我们通过抛出softmax来获得前5个预测的概率和类标签。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((0.93592983, 239, 'Bernese_mountain_dog'),\n",
       " (0.038448066, 241, 'EntleBucher'),\n",
       " (0.023756392, 240, 'Appenzeller'),\n",
       " (0.0018181865, 238, 'Greater_Swiss_Mountain_dog'),\n",
       " (9.113358e-06, 214, 'Gordon_setter'))"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "probs = F.softmax(logits, dim=1)\n",
    "probs5 = probs.topk(5)\n",
    "tuple((p,c, idx2label[c]) for p, c in zip(probs5[0][0].detach().numpy(), probs5[1][0].detach().numpy()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们已经准备好使用Lime。 Lime通过插管算法从原始输入图像生成图像阵列。 因此，我们需要提供两件事：（1）作为numpy数组的原始图像（2）分类函数，该函数将捕获的图像数组作为输入，并为每个图像生成每个类别的概率作为输出。\n",
    "对于Pytorch，我们首先需要定义两个单独的变换：（1）拍摄PIL图像，调整大小并对其进行裁剪（2）拍摄重新调整大小的图像并进行增白。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_pil_transform(): \n",
    "    transf = transforms.Compose([\n",
    "        transforms.Resize((256, 256)),\n",
    "        transforms.CenterCrop(224)\n",
    "    ])    \n",
    "\n",
    "    return transf\n",
    "\n",
    "def get_preprocess_transform():\n",
    "    normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],\n",
    "                                    std=[0.229, 0.224, 0.225])     \n",
    "    transf = transforms.Compose([\n",
    "        transforms.ToTensor(),\n",
    "        normalize\n",
    "    ])    \n",
    "\n",
    "    return transf    \n",
    "\n",
    "pill_transf = get_pil_transform()\n",
    "preprocess_transform = get_preprocess_transform()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在我们准备定义Lime需要的分类函数。 此函数的输入是图像的numpy数组，其中每个图像都是形状（通道，高度，宽度）的ndarray。 输出是形状（图像索引，类）的numpy aaray，其中数组中的每个值应该是该图像的概率，类组合。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def batch_predict(images):\n",
    "    model.eval()\n",
    "    batch = torch.stack(tuple(preprocess_transform(i) for i in images), dim=0)\n",
    "\n",
    "    device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "    model.to(device)\n",
    "    batch = batch.to(device)\n",
    "    \n",
    "    logits = model(batch)\n",
    "    probs = F.softmax(logits, dim=1)\n",
    "    return probs.detach().cpu().numpy()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "让我们测试示例图像的功能。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "239"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_pred = batch_predict([pill_transf(img)])\n",
    "test_pred.squeeze().argmax()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "| |                #                               | 2000 Elapsed Time: 0:00:11\n"
     ]
    }
   ],
   "source": [
    "explainer = lime_image.LimeImageExplainer()\n",
    "explanation = explainer.explain_instance(np.array(pill_transf(img)), \n",
    "                                         batch_predict, # classification function\n",
    "                                         top_labels=5, \n",
    "                                         hide_color=0, \n",
    "                                         num_samples=1000) # number of images that will be sent to classification function"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "让我们在图像上使用蒙版，并查看鼓励进行最佳预测的区域。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "from skimage.segmentation import mark_boundaries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x196067eb288>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "temp, mask = explanation.get_image_and_mask(explanation.top_labels[0], positive_only=True, num_features=5, hide_rest=False)\n",
    "img_boundry1 = mark_boundaries(temp/255.0, mask)\n",
    "plt.imshow(img_boundry1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x196094d1b88>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "temp, mask = explanation.get_image_and_mask(explanation.top_labels[0], positive_only=False, num_features=10, hide_rest=False)\n",
    "img_boundry2 = mark_boundaries(temp/255.0, mask)\n",
    "plt.imshow(img_boundry2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型中间层输出"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 图片测试\n",
    "img = 'data//images//dog.jpg'\n",
    "\n",
    "imgdata = Image.open(img).convert('RGB')\n",
    "out = imgdata.resize((84,84),Image.ANTIALIAS)\n",
    "imgnum = np.array(out)\n",
    "imgnum = imgnum.transpose((2,0,1))\n",
    "imgtor = torch.from_numpy(imgnum)\n",
    "imgtor = imgtor.squeeze(1)\n",
    "imgtor = torch.unsqueeze(imgtor, 0)\n",
    "imgtor = imgtor.float()\n",
    "\n",
    "plt.imshow(out)\n",
    "# plt.imshow(imgnum[2], cmap='gray')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 中间层特征提取\n",
    "class FeatureExtractor(nn.Module):\n",
    "    def __init__(self, submodule, extracted_layers):\n",
    "        super(FeatureExtractor, self).__init__()\n",
    "        self.submodule = submodule\n",
    "        self.extracted_layers = extracted_layers\n",
    " \n",
    "    # 自己修改forward函数\n",
    "    def forward(self, x):\n",
    "        outputs = []\n",
    "        for name, module in self.submodule._modules.items():\n",
    "            if name is \"fc\": x = x.view(x.size(0), -1)\n",
    "            x = module(x)\n",
    "            if name in self.extracted_layers:\n",
    "                outputs.append(x)\n",
    "        return outputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "extract_list = [\"conv1\", \"maxpool\", \"layer1\", \"avgpool\", \"fc\"]\n",
    "model = models.resnet18(pretrained=True)\n",
    "extract_result = FeatureExtractor(model, extract_list)\n",
    "show = extract_result(imgtor)[0].detach().numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(show[0][7], cmap='gray')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 第二种"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class LayerActivations():\n",
    "    features=None\n",
    "    \n",
    "    def __init__(self,model,layer_num):\n",
    "        self.hook = model[layer_num].register_forward_hook(self.hook_fn)\n",
    "    \n",
    "    def hook_fn(self,module,input,output):\n",
    "        self.features = output.cpu().data.numpy()\n",
    "    \n",
    "    def remove(self):\n",
    "        self.hook.remove()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "conv_out = LayerActivations(net.,3)\n",
    "o = net(Variable(imgtor))\n",
    "conv_out.remove()## Visualizing intermediate CNN layers\n",
    "act = conv_out.features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig = plt.figure(figsize=(20,50))\n",
    "fig.subplots_adjust(left=0,right=1,bottom=0,top=0.8,hspace=0,wspace=0.2)\n",
    "for i in range(30):\n",
    "    ax = fig.add_subplot(12,5,i+1,xticks=[],yticks=[])\n",
    "    ax.imshow(act[0][i])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 人脸检测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install dlib==19.17.0"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "collapsed_sections": [
    "66R3JVkZi4dB",
    "B2-RHVsii4dE",
    "cVsxuxqMi4dI",
    "F7pyZga2i4dL",
    "DK3zBw8Ii4dP",
    "d_unVPf_i4dZ",
    "E5mugAuJi4dd",
    "0pNOLecAi4dh",
    "w4KpWOhfi4d1",
    "Qm1uhoU8i4d3",
    "c9_3VIAXi4d5",
    "4eBDXcb-i4d8",
    "HJ3-Lf2Li4eI",
    "i-gVDwphi4eL",
    "VGvkmbbji4eO",
    "iBs5yjLBi4eP",
    "Hh454DHni4eo",
    "qHMZXitPi4ep",
    "Rx_0im0Ci4ev",
    "wYeu6cQQi4ex",
    "swiQXgLFi4ez",
    "1g5WQ88Ei4e1",
    "FyUy4VDci4e1",
    "9cKjwsX_i4e2",
    "phxQ3Ghzi4e2",
    "Tc6nr4T7i4e3",
    "_hYrErDbi4e4",
    "sOJr87Kxi4e4",
    "qkoN150xi4e6",
    "PMFLE2Mbi4e9",
    "G4o0GaUSi4fA",
    "lB0xJDGSi4fG"
   ],
   "name": "study.ipynb",
   "provenance": [],
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autoclose": false,
   "autocomplete": true,
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": false
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "313.875px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
